如何以编程方式强制完整的应用程序重启?例如杀,然后开始

时间:2013-07-22 18:51:54

标签: android

我的应用程序包含复杂的服务和活动UI。该应用程序在多个设备上运行,这些设备通过WIFI相互通信。

由于该应用程序是原型/开发中,我想添加对“强制重启”的支持,这将取消应用程序并重新启动它。根据用例,有很多共享的UI内容已经搞砸了,如果我只需触摸按钮就可以完全重启应用程序,那么在测试过程中会更容易(我有多个设备)。

那么,有没有人对如何:

有任何建议

1)强制关闭/停止/终止你自己的应用程序。

2)设置一个计时器/意图,告诉操作系统在关闭/停止/终止它之前启动你的应用程序。

任何提示将不胜感激!谢谢。

7 个答案:

答案 0 :(得分:7)

使用以下代码重新启动应用程序:

            Intent mStartActivity = new Intent(HomeActivity.this, SplashScreen.class);
            int mPendingIntentId = 123456;
            PendingIntent mPendingIntent = PendingIntent.getActivity(HomeActivity.this, mPendingIntentId, mStartActivity,
                    PendingIntent.FLAG_CANCEL_CURRENT);
            AlarmManager mgr = (AlarmManager) HomeActivity.this.getSystemService(Context.ALARM_SERVICE);
            mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
            System.exit(0);

答案 1 :(得分:2)

正如你所知,finish()是你想要用来杀死一个活动的东西。 A.C.R.的方式可行,但它只会重新启动你的活动,而不是真正杀掉这个过程,然后重启它。如果这就是你要找的东西,而不是有一个重新启动原始Activity的虚拟Activity,那么正确的方法就是使用标志。

Intent i = new Intent(this, WrapperActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

这些标志会一直清除你的后台堆栈,直到你正在创建的任何Activity的第一个实例,它会杀死它,然后创建一个新的。这基本上是A.C.R的例子,但它更简洁。

如果这对您来说不够好,为了做到这一点,这需要相当多的工作,并且需要更多关于Android系统的高级知识。您想要创建一个在后台运行的服务(如果您希望应用程序级别状态被杀死,则需要一个单独的进程),当您想要杀死应用程序,让应用程序自行终止或拥有应用程序时,您可以启动它该服务会为您杀死该应用程序,然后让该服务启动一个可以启动您的活动/应用程序备份的意图。

希望这有帮助!祝你好运!

答案 2 :(得分:1)

请尝试以下代码重新启动应用程序。

Intent i = getBaseContext().getPackageManager()
             .getLaunchIntentForPackage(getBaseContext().getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);

答案 3 :(得分:1)

以下是您需要做的事情:

  1. 创建粘性服务
  2. 使用服务
  3. 中的 killProcess 来杀死该应用
  4. 然后重新启动粘性服务,您可以使用getLaunchIntentForPackage意图
  5. 打开您的应用

    我喜欢使用Handler在主UI线程中执行此操作:

    private void scheduleForceClose() {
        final Handler closeAppHandler = new Handler();
                closeAppHandler.post(new Runnable() {
                    @Override public void run() {   
                     prefs.edit().putBoolean(StringConstants.FORCE_CLOSED_APP, true).commit();                        
                            Log.i(TAG, "Gonna force kill the app process completely!");
                            System.exit(0);
                 android.os.Process.killProcess(android.os.Process.myPid());                        
                    }
                });
    

    }

    private void scheduleForceOpen() {
        final Handler openAppHandler = new Handler();
        taskOpenApp = new TimerTask() {
            @Override public void run() {
                openAppHandler.post(new Runnable() {
                    @SuppressLint("ApplySharedPref") @Override public void run() {
                        Intent intent = getPackageManager().getLaunchIntentForPackage("com.company.yourpackagename");
                        // Reset the force-close flag so that the close timer can begin again                
                        prefs.edit().putBoolean(StringConstants.FORCE_CLOSED_APP, false).commit();
                        startActivity(intent);
                    }
                });
            }
        };
    
        // Decide whether we already force-closed the app, so that we don't repeat it
        boolean alreadyForceClosed = prefs.getBoolean(StringConstants.FORCE_CLOSED_APP, false);
        if (alreadyForceClosed) {
            Log.i(TAG, "App process has already been killed, so schedule app relaunch.");
            Timer timerOpen = new Timer();
            timerOpen.schedule(taskOpenApp, 5000 /* reopen the app after 5 sec */);
        }
    }
    

答案 4 :(得分:0)

没有办法。操作系统决定何时终止应用程序。无论是真的死了还是隐藏了,你的应用都可以恢复生机。

这很不方便,但平台就是这样的。您可以通过管理您可以杀死和恢复的活动来产生相同的面向用户的效果。

答案 5 :(得分:0)

可能有更正式的方法来做到这一点,但这就是我将如何实现这一目标。

例如,我假装只有两个活动,你当前所在的活动(我将其称为FirstActivity),另一个活动(我称之为SecondActivity)。

在第一个(你要重新启动它的那个)中,你会有一个启动应用程序重启的按钮。

restartButton.setOnClickListener(new OnClickListener(){
        @Override
        onClick(View v){
          //when clicked it starts the helper activity and closes the one you're in
          startActivity(new Intent(this, SecondActivity.class));
          finish(); //or you could use FirstActivity.onDestroy(); if you want it completely dead
        }
});

第二个活动:它的全部目的是让您基本上可以从您的应用程序重启您的应用程序(关闭其他所有内容,然后在此重启)

Class SecondActivity extends Activity{
        @Override
        onCreate(Bundle savedInstanceState){
                ...
                //it restarts the old activity so it's new and ends this one
                startActivity(new Intent(this, FirstActivity.class));
                finish(); //or you could use SecondActivity.onDestroy(); if you want it
        }

}

这将完全重启第一个活动。我不确定它是否会像你希望的那样彻底,但实际上没有其他方法可以做这种事情AFAIK。

答案 6 :(得分:0)

要重新启动我的应用程序,我很简单地执行此操作并且可以正常工作:

Intent i = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
System.exit(0);

如果我不使用这两个标志,它将无法工作。 (使用 Android 11、API 30、Pixel 3 设备)