从状态栏启动应用程序而无需重新创建

时间:2013-03-05 06:45:45

标签: android

我正在创建在状态栏中显示通知图标的应用程序。当用户打开状态栏并点击图标时,应启动应用程序。

我正在寻找一种方法来避免在此次发布期间重新创建应用程序。我创建了测试应用程序并向处理程序onCreate,onRestart,onResume,onStop和onDestroy添加了日志消息。日志消息说明了问题:

  1. 用户启动应用程序 - onCreate,onResume
  2. 用户按下HOME按钮 - onStop
  3. 用户打开应用程序列表并再次启动应用程序 - onRestart,onResume
  4. 用户按下HOME按钮 - onStop
  5. 用户打开最近的应用程序列表并选择应用程序 - onRestart,onResume
  6. 用户按下HOME按钮 - onStop
  7. 用户打开状态栏并点击应用程序图标 - onDestroy,onCreate,onResume。
  8. 步骤7有不同的行为,然后3)和5) - 这里有onDestroy。换句话说,重新创建应用程序的实例。是否有可能避免这种娱乐?

    这是我的测试活动的代码:

    public class MainActivity extends Activity {
        private final String LOG_TAG = "com.example.notificationtest";
    
        @Override protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            showNotification(this);
            Log.d(LOG_TAG, "NotificationTest: OnCreate");
        }
    
        @Override protected void onRestart() {
            super.onRestart();
            Log.d(LOG_TAG, "NotificationTest: OnRestart");
        }
    
        @Override protected void onResume() {
            super.onResume();
            Log.d(LOG_TAG, "NotificationTest: OnResume");
        }
    
        @Override protected void onDestroy() {
            super.onDestroy();
            Log.d(LOG_TAG, "NotificationTest: OnDestroy");
        }
    
        @Override protected void onStop() {
            super.onStop();
            Log.d(LOG_TAG, "NotificationTest: OnStop");
        }
    
    
        private static final int NOTIF_ID = 91371;
    
        public static void showNotification(Context context) {
            final Intent result_intent = new Intent(context, MainActivity.class);
            result_intent.setAction(Intent.ACTION_MAIN);
            result_intent.addCategory(Intent.CATEGORY_LAUNCHER);
            //result_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            //result_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            //result_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);                
    
            TaskStackBuilder stack_builder = TaskStackBuilder.create(context);
            stack_builder.addParentStack(MainActivity.class);
            stack_builder.addNextIntent(result_intent);
    
            PendingIntent pending_intent = stack_builder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    
            android.support.v4.app.NotificationCompat.Builder builder = new android.support.v4.app.NotificationCompat.Builder(context);
    
            Resources res = context.getResources();
            builder.setContentIntent(pending_intent)
                .setSmallIcon(R.drawable.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ic_launcher))
                .setTicker("test")
                .setWhen(System.currentTimeMillis())
                .setAutoCancel(false)
                .setContentTitle("title")
                .setContentInfo("cinfo")
                .setContentText("ctext");
            Notification n = builder.build();
            n.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;   
    
            NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
            nm.notify(NOTIF_ID, n);     
        }
    }
    

    有些标志可以设置为result_intent,例如FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_NEW_TASK。它们允许指定应在启动时重新启动活动(使用活动启动模式“singleTop”,“singleTask”等)。但是应该设置什么标志以避免重启?可能我应该以某种方式配置pending_intent?

    任何帮助将非常感谢。

    解决

    非常感谢答案,问题解决了。

    描述here同样的问题。我已经检查了该主题的测试项目,发现我的代码存在差异。要解决这个问题,我的代码应该按照以下方式进行更改:

    final Intent result_intent = new Intent(context, MainActivity.class);
    //result_intent.setAction(Intent.ACTION_MAIN); // (1)
    //result_intent.addCategory(Intent.CATEGORY_LAUNCHER); // (2)
    result_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    

    另一组标志也有效:

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

    主要观点是评论第(1)和(2)行

1 个答案:

答案 0 :(得分:0)

添加:

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

就像

一样

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

还维护活动堆栈