PendingIntent ไม่ส่ง Intent พิเศษ


127

ฉันMainActicity จะเริ่มต้นRefreshServiceด้วยการIntentที่มีความพิเศษที่เรียกว่าbooleanisNextWeek

ของฉันRefreshServiceทำให้Notificationซึ่งเริ่มต้นของฉันMainActivityเมื่อผู้ใช้คลิกที่มัน

ลักษณะเช่นนี้:

    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);

ในฐานะที่คุณสามารถเห็นnotificationIntentควรมีความbooleanพิเศษIS_NEXT_WEEKที่มีค่าของที่จะใส่ในisNextWeekPendingIntent

เมื่อฉันคลิกตอนนี้Notificationฉันจะได้รับfalseเป็นค่าของisNextWeek

นี่คือวิธีที่ฉันได้รับค่าในMainActivity:

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

เข้าสู่ระบบ:

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

เมื่อฉันโดยตรงเริ่มต้นMainActivityด้วยการIntentที่มีìsNextValue`เช่นนี้:

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

ทุกอย่างทำงานได้ดีและฉันได้รับtrueเมื่อเป็นisNextWeektrue

ฉันทำอะไรผิดที่มีfalseค่าเสมอ?

UPDATE

วิธีนี้ช่วยแก้ปัญหาได้: https://stackoverflow.com/a/18049676/2180161

อ้างถึง:

ความสงสัยของฉันคือเนื่องจากสิ่งเดียวที่เปลี่ยนแปลงใน Intent คือความพิเศษPendingIntent.getActivity(...)วิธีการของโรงงานจึงใช้เจตนาเดิมอีกครั้งเป็นการเพิ่มประสิทธิภาพ

ใน RefreshService ให้ลอง:

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

ดู:

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

อัปเดต 2

ดูคำตอบด้านล่างPendingIntent.FLAG_UPDATE_CURRENTว่าทำไมมันจะดีกว่าการใช้งาน


2
PendingIntent.FLAG_CANCEL_CURRENT ทำงานให้ฉันขอบคุณ
Pelanes

1
ช่วยฉันทำงานได้หลายชั่วโมง ตอบถูก!
TharakaNirmana

คุณมีคำถามและวิธีแก้ไข: D เยี่ยมมาก ฉันคิดว่าคุณควรเพิ่มเป็นคำตอบสำหรับคำถาม + 10 ดีกว่า + 5s;)
Muhammed Refaat

อ้างถึงโซลูชันนี้: stackoverflow.com/questions/1198558/…
M.Noman

FLAG_UPDATE_CURRENT ไม่เพียงพอในกรณีของฉันเนื่องจากวิดเจ็ตของฉันใช้ PendingIntent เดียวกันอีกครั้ง ฉันลงเอยด้วยการใช้ FLAG_ONE_SHOT สำหรับการกระทำที่เกิดขึ้นน้อยครั้งและปล่อยให้วิดเจ็ต PendingIntent เหมือนเดิม
Eir

คำตอบ:


30

การใช้ PendingIntent.FLAG_CANCEL_CURRENT ไม่ใช่วิธีแก้ปัญหาที่ดีเนื่องจากการใช้หน่วยความจำอย่างไม่มีประสิทธิภาพ แทนที่จะใช้PendingIntent.FLAG_UPDATE_CURRENT

ใช้Intent ด้วย FLAG_ACTIVITY_SINGLE_TOP (กิจกรรมจะไม่ถูกเรียกใช้หากทำงานอยู่ที่ด้านบนสุดของกองประวัติ)

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
                );

แล้ว:

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

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

ตอนนี้ควรใช้งานได้แล้ว


หากคุณยังไม่มีพฤติกรรมที่คาดหวังให้ลองใช้ void onNewIntent(Intent intent)ตัวจัดการเหตุการณ์ด้วยวิธีนี้คุณจะสามารถเข้าถึงจุดประสงค์ใหม่ที่ถูกเรียกสำหรับกิจกรรม (ซึ่งไม่เหมือนกับการเรียกใช้ getIntent () ซึ่งจะส่งคืน Intent แรกที่เปิดตัวเสมอ กิจกรรมของคุณ

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

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

21

ฉันคิดว่าคุณต้องอัปเดตIntentเมื่อคุณได้รับใหม่โดยการลบล้างonNewIntent(Intent)ในกิจกรรมของคุณ เพิ่มสิ่งต่อไปนี้ในกิจกรรมของคุณ:

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

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

แก้ไข:

สิ่งนี้จำเป็นเฉพาะในกรณีที่กิจกรรมของคุณได้เริ่มขึ้นแล้วเมื่อได้รับความตั้งใจ หากกิจกรรมของคุณเริ่มต้น (และไม่ใช่แค่ดำเนินการต่อ) ตามเจตนาแสดงว่าปัญหาอยู่ที่อื่นและข้อเสนอแนะของฉันอาจไม่สามารถแก้ไขได้


สิ่งนี้จะปรากฏขึ้นด้วยหากกิจกรรมถูกปิดและหลังจากนั้นเปิดขึ้นพร้อมกับการแจ้ง
maysi

3

รหัสต่อไปนี้ควรใช้งานได้: -

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);

ใน MainActivity onCreate:

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

new Notification(icon, message, when);เลิกใช้งาน
maysi

จะทำยังไงก็ได้โดยไม่ใช้ CLEAR_TOP?
Richard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.