getIntent () Các tính năng bổ sung luôn NULL


77

Tôi đã viết một Ứng dụng Android đơn giản hiển thị Thông báo tùy chỉnh như sau:

Context context = getApplicationContext();          
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification( R.drawable.icon, title, System.currentTimeMillis());  
Intent notificationIntent = new Intent( context,  this.getClass()); 
notificationIntent.putExtra("com.mysecure.lastpage", "SECURECODE"); 
PendingIntent pendingIntent = PendingIntent.getActivity( context , 0, notificationIntent, 0);               
notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
notification.contentView = new RemoteViews(context.getPackageName(), R.layout.notifypbar);
notification.contentIntent = pendingIntent;

notification.contentView.setTextViewText(R.id.notifypb_status_text, text);
notification.contentView.setProgressBar(R.id.notifypb_status_progress, 100, (int)(100*progress), false);

manager.notify(104, notification);

Đoạn mã này được gọi là CHỈ DUY NHẤT trong ứng dụng của tôi và nó hiển thị thông báo với thanh tiến trình (tất cả đều chính xác).

Bây giờ, khi người dùng nhấp vào thông báo này, ứng dụng của tôi sẽ xử lý onResumesự kiện.

public void onResume()
{
    super.onResume();
    // TODO: Extras è SEMPRE NULL!!! impossibile!
    Intent callingintent = getIntent(); 
    Bundle extras = callingintent.getExtras();

nhưng tính năng bổ sung luôn là NULL!

Tôi đã thử bất kỳ sự kết hợp nào của:

notificationIntent.putExtra("com.mysecure.lastpage", "SECURECODE");

hoặc là

Bundle extra = new Bundle();
extra.putString(key, value);
notificationIntent.putExtra(extra);

nhưng getIntent (). getExtras () luôn trả về NULL.


Bạn đã cố gắng thiết lập Ngữ cảnh ứng dụng trong Thông báo chưa?
apesa

Câu trả lời:


118

Đây là tình huống:
Phương thức getIntent()trả về ý định ĐẦU TIÊN hơn là hoạt động khởi chạy.

Vì vậy, khi hoạt động được ĐÓNG CỬA (chấm dứt) và người dùng nhấp vào thông báo, nó sẽ chạy một phiên bản mới của hoạt động và getIntent()hoạt động như mong đợi (Phần bổ sung thì không null ).

Nhưng nếu hoạt động ở trạng thái "ngủ" (hoạt động ở chế độ nền) và người dùng nhấp vào thông báo, getIntent()luôn trả về ý định ĐẦU TIÊN đã bắt đầu hoạt động chứ KHÔNG phải ý định thông báo.

Vì vậy, để nắm bắt mục đích thông báo trong khi ứng dụng đang chạy, chỉ cần sử dụng

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

và sau đó ghi đè onNewIntent(Intent newintent).

Vì vậy, khi một ứng dụng chạy lần đầu, getIntent()có thể được sử dụng và khi ứng dụng được tiếp tục từ chế độ ngủ, sẽ onNewIntenthoạt động.


44
Điều sau đây phù hợp với tôi: PendingIntent pendingIntent = PendingIntent.getActivity (ngữ cảnh, 0, ý định, PendingIntent.FLAG_UPDATE_CURRENT);
user672009

3
câu trả lời awsme .. Tôi đã lãng phí rất nhiều thời gian để gỡ lỗi vấn đề này. Cảm ơn rất nhiều.
Deepak

trong trường hợp của tôi, hãy thêm android: LauncherMode = "singleTask" vào hoạt động của launcher. Cảm ơn bạn!
Cuong Nguyen

98

Chỉ cần viết mã này bên trên phương thức Resume () của bạn. Đây là tất cả những gì nó cần. Điều này làm mới ý định - tôi không thực sự biết, nhưng nó hoạt động.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

1
giải pháp này đã làm việc cho tôi trong một hoạt động, không được thử nghiệm trong dịch vụ.
coolcool1994

2
Bạn là một người tiết kiệm cuộc sống!
Farouk Touzi

3
Lưu ngày sau 2 ngày của tôi :))))

20

Sự cố: Bạn đang gửi cùng một mã yêu cầu cho các cường độ đang chờ xử lý của mình. Thay đổi cai nay đi.

Giải pháp : Đặt biến toàn cục int UNIQUE_INT_PER_CALL = 0 và khi bạn tạo lệnh gọi pendingIntent như bên dưới.

PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);
UNIQUE_INT_PER_CALL++; // to increment.

1
Điều này đã làm việc cho tôi. Tôi đã sử dụng cái nàyint notificationId = new Random().nextInt();
Jonas Borggren 16/12/14

Ok, điều này giải quyết được vấn đề của tôi, bạn có thể giải thích tại sao điều này lại quan trọng không? Trong trường hợp của tôi, tôi chỉ gửi một ý định.
thạch hóa

3

Vì có vẻ như hoạt động của bạn đã chạy, tôi nghĩ bạn cần chỉ định FLAG_UPDATE_CURRENT, nếu không getIntent()cuộc gọi sẽ trả về cuộc gọi trước đó. Xem câu trả lời này .


Tuy nhiên, tôi không có ý định "TRƯỚC MỘT" trong đơn đăng ký của mình. Đoạn mã đó sẽ chỉ được gọi là MỘT LẦN và không có ý định nào khác sẽ được tạo hoặc cập nhật sau đó.
Magius

Tất cả các hoạt động này được bắt đầu bởi ý đồ, do đó phải là một ý định trước. Hah, tôi vừa thấy câu trả lời của riêng bạn, đó là ý của tôi!
dmon

1
Đây là những gì đã giải quyết nó cho tôi. đây là nơi để thiết lập rằng lá cờ: developer.android.com/reference/android/app/...
finiteloop

-9

Nhìn vào Tùy chọn chia sẻ để chuyển và truy xuất các cặp khóa / giá trị liên tục.


tôi không cần phải lưu trữ dữ liệu vào tùy chọn. Tôi sử dụng sở thích được chia sẻ cho mục đích khác. Tôi cần vượt qua ExtraData thông qua Intent.
Magius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.