21

Tôi đang cố gắng gửi thông tin từ thông báo đến hoạt động được gọi, trong khi từ hoạt động của tôi, tôi đã bị vô hiệu.Thông báo Android PendingIntent Extras null

Mã cho thông báo là:

private void showNotification() { 
Intent resultIntent = new Intent(this, MainActivity.class); 
if (D) 
    Log.d(TAG, "Id: " + Id); 
resultIntent.putExtra("ineedid", deviceId); 

TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
stackBuilder.addParentStack(MeterActivity.class); 
stackBuilder.addNextIntent(resultIntent); 
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, 
    PendingIntent.FLAG_UPDATE_CURRENT); 
// Bundle tmp = resultIntent.getExtras(); 
// if (tmp == null) { 
// Log.d(TAG, "tmp bundle is null"); 
// } else { 
// long id = tmp.getLong("ineedid", -1); 
// Log.d(TAG, "tmp id : " + id); 
// } 
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
    BLEMessengerService.this) 
    .setSmallIcon(R.drawable.ic_action_search) 
    .setContentTitle("Event tracker") 
    .setContentText("Events received").setOngoing(true) 
    .setContentIntent(resultPendingIntent) 
    .setWhen(System.currentTimeMillis()); 

int mId = R.string.service_notification_start_service; 
mNM.notify(mId, mBuilder.getNotification()); 
} 

Mã cho thu thập thông tin từ ý định vào các hoạt động chính;

Bundle extras = getIntent().getExtras(); 
if (extras != null) { 
    long deviceID = getIntent().getLongExtra("ineedid", 
     -1); 
    if (ID == -1) { 
    if (D) 
     Log.i(TAG_D, "Wrong Id received."); 
    finish(); 
    } else { 
    device = dataSource.getDeviceByID(deviceID); 
    if (D) 
     Log.i(TAG_D, "Get the id."); 
    } 
} else { 
    if (D) 
    Log.d(TAG_D, "Bundle is null"); 
    finish(); 
} 

Tôi đã xác minh trước khi thông báo được thông báo, gói không phải là rỗng và có thêm id. Trong khi, khi tôi cố gắng lấy nó từ ý định, nó đã biến mất. Cứu giúp.

+0

Tôi cũng đã cố gắng thêm "resultIntent.addFlags (Intent.FLAG_ACTIVITY_SINGLE_TOP);", nhưng không có tác phẩm. – antonio081014

+1

Có một lý do bạn không sử dụng 'resultPendingIntent.getExtras()'? – PearsonArtPhoto

+0

Tôi chỉ thực hiện những dòng đó để kiểm tra xem pendingIntent của tôi có Extras hay không, và tôi đã xác minh nó có những gì tôi đặt ở đó. – antonio081014

Trả lời

8

Tôi chỉ có câu trả lời, add dòng: resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

LƯU Ý: nếu bạn thêm nó như resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); Nó sẽ không làm việc.

Tôi cũng đã thử các cờ khác như "FLAG_ACTIVITY_NEW_TASK" và "FLAG_ACTIVITY_RESET_TASK_IF_NEEDED". không hoạt động ở đây.

+1

Tôi đã thử cùng một điều. Bất kỳ đầu mối nào trong tài liệu hướng dẫn tại sao cờ này là cần thiết? Nó chỉ nói "Nếu được đặt, hoạt động sẽ không được khởi chạy nếu nó đang chạy ở đầu ngăn xếp lịch sử". – mparaz

21

Đối với tôi, ngoài việc thiết lập Intent.FLAG_ACTIVITY_SINGLE_TOP, tôi đã có thêm một hành động độc đáo đến mục đích:

Intent resultIntent = new Intent(caller, NotificationActivity.class); 

    String xId = getNextUniqueId(); 
    resultIntent.putExtra("x_id", xId); 
    resultIntent.setAction(xId); 
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 

.. mà không setAction (..), Extras là null trên tiếp cận mục đích nhận bởi NotificationActivity của tôi.

bài này giúp giải thích nó: https://stackoverflow.com/a/3128271/2162226

13

trong PendingIntent sử dụng cờ này PendingIntent.FLAG_UPDATE_CURRENT nó làm việc cho tôi

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
0

Tôi đã làm việc trong một thông báo địa phương plugin cho Unity khi tôi gặp phải cùng một vấn đề -> Tôi đã khởi chạy ứng dụng, lên lịch thông báo địa phương, gửi ứng dụng lên nền, thông báo cục bộ xuất hiện và khi tôi nhấp vào ứng dụng, ứng dụng đã được tiếp tục và getIntent().getExtras()null.

Trong trường hợp của tôi, vấn đề là tôi đã cố gắng để có được các tính năng bổ sung không đúng mục đích. Cố gắng in các ý định với một toString đơn giản, tại thời điểm tạo và khi bạn nhận được nó, để đảm bảo rằng nhận được là những gì bạn mong đợi.

Ngoài ra, hãy xem phương thức onNewIntent.

Các vấn đề liên quan