【问题标题】:Application crashes when clicking on a notification if the application is minimized如果应用程序被最小化,单击通知时应用程序崩溃
【发布时间】:2014-12-15 09:03:31
【问题描述】:

我在我的应用程序中创建了一个通知。当我有多个通知时,我需要按下每个打开的 Activity 并根据意图传输的参数执行操作。为此,我设置了意图标志

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

但是,如果您在应用程序打开或关闭时单击通知,则一切正常。但是如果应用程序被最小化,错误输出。

我换了旗帜

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

现在,当应用程序最小化时,我点击它正常打开的通知。但还有其他问题。片段被打开,数据被加载。

这就是我生成通知的方式:

private void generateNotification(Context context, String title, String message,int groupid,Intent data) {

    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
    Intent intent = new Intent(context,MyActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

    if (groupid == 1) {
        intent.putExtra("guest",data.getStringExtra("guest"));
        intent.putExtra("hotel",data.getStringExtra("hotel"));
        intent.putExtra("room",data.getStringExtra("room"));
    }

    if (groupid==4){
        intent.putExtra("hotel",data.getStringExtra("hotel"));
        intent.putExtra("guest",data.getStringExtra("guest"));
    }

    if (groupid==5){
        intent.putExtra("hotel",data.getStringExtra("hotel"));
    }

    int requestCode = ("requestCode" + System.currentTimeMillis()).hashCode();
    intent.putExtra("group_id",groupid);
    intent.setAction(String.valueOf(requestCode));
    Log.d("mylogout", "group_id: " + groupid);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    Notification notification   = new NotificationCompat.Builder(context)
                    .setContentIntent(pendingIntent)
                    .setSmallIcon(R.drawable.ic_stat_gcm)
                    .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_stat_gcm))
                    .setTicker("Новое сообщение")
                    .setWhen(System.currentTimeMillis())
                    .setAutoCancel(true)
                    .setContentTitle(title)
                    .setContentText(message)
                    .setDefaults(Notification.DEFAULT_SOUND)
                    .build();
    notificationManager.notify(requestCode, notification);
}

That is how I get the intent to Activity:

@Override
public void onNewIntent(Intent intent) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    Bundle arguments;
    Fragment fragment;
    String guest;
    Bundle extras = intent.getExtras();
    if (extras != null) {
        if (extras.containsKey("group_id")) {
            int msg = extras.getInt("group_id");
            String hotel = extras.getString("hotel");
            switch (msg) {
                case 5:
                    fragment = new PagerLogbookContainer();
                    arguments = new Bundle();
                    arguments.putString(ARGUMENT_PAGE_HOTEL, hotel);
                    fragment.setArguments(arguments);
                    fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
                    setTitle(hotel);
                    break;
                case 1:
                    guest = extras.getString("guest");
                    String room = extras.getString("room");
                    fragment = new Guest();
                    arguments = new Bundle();
                    arguments.putString("guestid", guest);
                    arguments.putString("hotel", hotel);
                    arguments.putString("room", room);
                    fragment.setArguments(arguments);
                    fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    fragmentManager.beginTransaction().replace(R.id.container, fragment, "guest").commit();
                    break;
                case 4:
                    guest = extras.getString("guest");
                    fragment = new Survey();
                    arguments = new Bundle();
                    arguments.putString("guestid", guest);
                    arguments.putString("hotel", hotel);
                    fragment.setArguments(arguments);
                    fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
                    break;
            }
        }
    } else {

        fragment = new StatusInfo();
        fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
        setTitle("Статус инфо");

    }
}

并在 MyActivity 的 onCreate() 中调用此方法。

我希望在按下时收到通知,打开我的 Activity 并在 Activity 处于任何状态时设置必要的片段。

如果标志设置为intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);并且应用程序被最小化错误输出:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
            at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1365)
            at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1383)
            at android.support.v4.app.FragmentManagerImpl.popBackStack(FragmentManager.java:507)
            at com.managment.pavel.managmentgradle.MyActivity.onNewIntent(MyActivity.java:158)
            at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1123)
            at android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2042)
            at android.app.ActivityThread.performNewIntents(ActivityThread.java:2055)
            at android.app.ActivityThread.handleNewIntent(ActivityThread.java:2064)
            at android.app.ActivityThread.access$1400(ActivityThread.java:123)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1194)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4464)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:822)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:589)
            at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android android-intent android-notifications android-pendingintent


    【解决方案1】:

    【讨论】:

    • 这是我得到的第一个链接。我还没有找到解决方案。或者不明白。生物能详细给我解释一下吗?
    • Activity的158行内容是什么?请过去。
    • fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    • 1.尝试添加 outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");给你片段代码。 2.使用commitAllowingStateLoss()代替commit()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多