পেন্ডিং ইন্টেন্ট ইন্টেন্ট অতিরিক্ত পাঠায় না


127

আমার MainActicity শুরু RefreshServiceএকটি সঙ্গে Intentযা হয়েছে booleanঅতিরিক্ত নামক isNextWeek

আমার এমন 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মূল্যের সঙ্গে isNextWeekযা রাখা হয় PendingIntent

আমি এখন এটি ক্লিক করলে আমি 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

আমি যখন সরাসরি এইরূপে N নেক্সটভ্যালু` MainActivityদিয়ে একটি শুরু করি Intent:

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

সবকিছু ঠিক কাজ করে এবং আমি পেতে trueযখন isNextWeekহয় true

আমি কী ভুল করব যে সর্বদা একটি falseমান আছে?

হালনাগাদ

এটি সমস্যার সমাধান করে: https://stackoverflow.com/a/18049676/2180161

উদ্ধৃতি:

আমার সন্দেহটি হ'ল, যেহেতু ইন্টেন্টে পরিবর্তিত হওয়া কেবলমাত্র অতিরিক্ত জিনিস, PendingIntent.getActivity(...)কারখানা পদ্ধতিটি পুরানো অভিপ্রায়টিকে কেবল অপ্টিমাইজেশন হিসাবে পুনরায় ব্যবহার করে।

রিফ্রেশ সার্ভিসে, চেষ্টা করুন:

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
পেন্ডিং ইন্টেন্ট.এফএলএজি_স্যান্সেল_সিউরএনটি আমার জন্য কাজ করেছে, ধন্যবাদ
পেলেনস

1
আমাকে অনেক ঘন্টা কাজ বাঁচিয়েছে। সঠিক উত্তর!
থারাকা নির্মণা

আপনার কাছে প্রশ্ন এবং সমাধান রয়েছে: দুর্দান্ত। আমি মনে করি আপনার এটিকে প্রশ্নের উত্তর হিসাবে যুক্ত করা উচিত। + 10s + 5s এর চেয়ে ভাল;)
মুহাম্মদ রেফায়াত

এই সমাধান করতে উল্লেখ: stackoverflow.com/questions/1198558/...
M.Noman

FLAG_UPDATE_CURRENT আমার ক্ষেত্রে যথেষ্ট হয়নি, যেহেতু একই উইন্ডিজটি আমার উইজেট দ্বারা পুনরায় ব্যবহার করা হয়েছিল। খুব কমই ঘটে যাওয়া ক্রিয়াটির জন্য আমি FLAG_ONE_SHOT ব্যবহার করে শেষ করেছি এবং উইজেটটি মুলতুবি থাকা অবধি অক্ষত রেখেছি।
ইয়ার

উত্তর:


29

পেন্ডিংআইজন্ট.এফএলএজি_স্যানসেল_সিউরএনটি ব্যবহার করা মেমরির অকার্যকর ব্যবহারের কারণে ভাল সমাধান নয়। পরিবর্তে পেন্ডিং ইন্টেন্ট ব্যবহার করুন LA FLAG_UPDATE_CURRENT

ইনটেন্টও ব্যবহার করুন Fএফএলএজি_এসিটিভিটি_সিংল_এইচপিওপি (ক্রিয়াকলাপটি ইতিমধ্যে ইতিহাসের স্ট্যাকের শীর্ষে চলমান থাকলে) চালু করা হবে না।

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 () হিসাবে কল করার মত নয়, এটি সর্বদা প্রথম উদ্দীপনাটি ফিরে আসবে আপনার ক্রিয়াকলাপ

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

মূল ক্রিয়াকলাপ অনক্রিটে:

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

new Notification(icon, message, when);
অবচয়

যাইহোক CLEAR_TOP ছাড়াই এটি করবেন?
রিচার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.