PendingIntent không gửi bổ sung ý định


127

My MainActicity bắt đầu RefreshServicevới một Intentcái có booleanthêm một gọi isNextWeek.

My RefreshServicelàm cho Notificationnó bắt đầu MainActivitykhi người dùng nhấp vào nó.

nó trông như thế này:

    Log.d("Refresh", "RefreshService got: isNextWeek: " + String.valueOf(isNextWeek));

    Intent notificationIntent = new Intent(this, MainActivity.class);
    notificationIntent.putExtra(MainActivity.IS_NEXT_WEEK, isNextWeek);

    Log.d("Refresh", "RefreshService put in Intent: isNextWeek: " + String.valueOf(notificationIntent.getBooleanExtra(MainActivity.IS_NEXT_WEEK,false)));
    pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

    builder = new NotificationCompat.Builder(this).setContentTitle("Title").setContentText("ContentText").setSmallIcon(R.drawable.ic_notification).setContentIntent(pendingIntent);
    notification = builder.build();
    // Hide the notification after its selected
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(NOTIFICATION_REFRESH, notification);

Như bạn có thể thấy notificationIntentnên có booleanthêm IS_NEXT_WEEKvới giá trị isNextWeekđược đặt trong PendingIntent.

Khi tôi nhấp vào bây giờ, Notificationtôi luôn nhận được falsegiá trị củaisNextWeek

Đây là cách tôi nhận được giá trị trong MainActivity:

    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);

Nhật ký:

08-04 00:19:32.500  13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity sent: isNextWeek: true
08-04 00:19:32.510  13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService got: isNextWeek: true
08-04 00:19:32.510  13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService put in Intent: isNextWeek: true
08-04 00:19:41.990  13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity.onCreate got: isNextWeek: false

Khi tôi trực tiếp bắt đầu MainActivityvới một Intentvới ìsNextValue` như thế này:

    Intent i = new Intent(this, MainActivity.class);
    i.putExtra(IS_NEXT_WEEK, isNextWeek);
    finish();
    startActivity(i);

tất cả mọi thứ hoạt động tốt và tôi nhận được truekhi isNextWeektrue.

Điều gì làm tôi sai khi luôn có một falsegiá trị?

CẬP NHẬT

điều này giải quyết vấn đề: https://stackoverflow.com/a/18049676/2180161

Trích dẫn:

Sự nghi ngờ của tôi là, vì điều duy nhất thay đổi trong Ý định là các tính năng bổ sung, nên PendingIntent.getActivity(...)phương thức xuất xưởng chỉ đơn giản là sử dụng lại mục đích cũ như một sự tối ưu hóa.

Trong Làm mới Dịch vụ, hãy thử:

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

Xem:

http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT

CẬP NHẬT 2

Xem câu trả lời dưới đây tại sao nó là tốt hơn để sử dụng PendingIntent.FLAG_UPDATE_CURRENT.


2
PendingIntent.FLAG_CANCEL_CURRENT đã làm việc cho tôi, cảm ơn
Pelanes

1
tiết kiệm cho tôi nhiều giờ làm việc. Câu trả lời chính xác!
TharakaNirmana

bạn có câu hỏi và giải pháp: D tuyệt vời. Tôi nghĩ bạn nên thêm nó như một câu trả lời cho các câu hỏi. + 10 giây tốt hơn + 5s;)
Muhammed Refaat

Tham khảo giải pháp này: stackoverflow.com/questions/1198558/ từ
M.Noman

FLAG_UPDATE_CURRENT không đủ trong trường hợp của tôi, vì cùng một PendingIntent đã được sử dụng lại bởi tiện ích của tôi. Tôi đã kết thúc bằng FLAG_ONE_SHOT cho hành động hiếm khi xảy ra và giữ nguyên tiện ích PendingIntent.
Eir

Câu trả lời:


29

Sử dụng PendingIntent.FLAG_CANCEL_CURRENT không phải là một giải pháp tốt vì sử dụng bộ nhớ không hiệu quả. Thay vào đó, hãy sử dụng PendingIntent.FLAG_UPDATE_CURRENT .

Cũng sử dụng Intent.FLAG_ACTIVITY_SINGLE_TOP (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ử).

Intent resultIntent = new Intent(this, FragmentPagerSupportActivity.class).
                    addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
resultIntent.putExtra(FragmentPagerSupportActivity.PAGE_NUMBER_KEY, pageNumber);

PendingIntent resultPendingIntent =
                PendingIntent.getActivity(
                        this,
                        0,
                        resultIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );

Sau đó:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);

            int startPageNumber;
            if ( savedInstanceState != null)
            {
                startPageNumber = savedInstanceState.getInt(PAGE_NUMBER_KEY);
//so on

Nó nên hoạt động ngay bây giờ.


Nếu bạn vẫn chưa có hành vi mong đợi, hãy thử triển khai void onNewIntent(Intent intent)trình xử lý sự kiện, theo cách đó bạn có thể truy cập mục đích mới được gọi cho hoạt động (không giống như chỉ gọi getIntent (), điều này sẽ luôn trả về Ý định đầu tiên được khởi chạy hoạt động của bạn.

@Override
protected void onNewIntent(Intent intent) {
    int startPageNumber;

    if (intent != null) {
        startPageNumber = intent.getExtras().getInt(PAGE_NUMBER_KEY);
    } else {
        startPageNumber = 0;
    }
}

21

Tôi nghĩ bạn cần cập nhật Intentkhi bạn nhận được một cái mới bằng cách ghi đè onNewIntent(Intent)vào Hoạt động của bạn. Thêm phần sau vào Hoạt động của bạn:

@Override
public void onNewIntent(Intent newIntent) {
    this.setIntent(newIntent);

    // Now getIntent() returns the updated Intent
    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);        
}

Biên tập:

Điều này chỉ cần thiết nếu Hoạt động của bạn đã được bắt đầu khi nhận được ý định. Nếu hoạt động của bạn được bắt đầu (và không chỉ tiếp tục lại) theo ý định, thì vấn đề là ở nơi khác và đề xuất của tôi có thể không khắc phục được.


điều này cũng xuất hiện nếu hoạt động được đóng lại và sau đó được mở bằng thông báo.
maysi

3

Mã sau sẽ hoạt động: -

int icon = R.drawable.icon;
String message = "hello";
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, message, when);

Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.putExtra("isNexWeek", true);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, title, message, pIntent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, notification);

Trong MainActivity onCreate:

if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("isNextWeek")) {
        boolean isNextWeek = getIntent().getExtras().getBoolean("isNextWeek");
}

new Notification(icon, message, when);không được dùng nữa
maysi

Dù sao để làm điều đó mà không có CLEAR_TOP?
Richard
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.