9

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

由于该应用程序是原型/开发中,我想添加对“强制重启”的支持,这将终止应用程序并重新启动它干净。根据用例的不同,有很多共享的 UI 内容被搞砸了,如果我可以触摸一个按钮来完全重新启动应用程序,那么在测试期间(我有多个设备)会更容易。

那么,有没有人对如何:

1)从您的应用程序中强制关闭/停止/杀死您自己的应用程序。

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

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

4

7 回答 7

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);
于 2016-03-04T14:01:42.613 回答
3

要重新启动我的应用程序,我很简单,它正在工作:

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 设备)

于 2020-12-23T21:00:08.677 回答
2

如您所知,finish() 是您想要用来终止活动的方法。ACR 的方式会起作用,但是它只会重新启动您的活动,并不会真正终止该进程并重新启动它。如果这就是您要寻找的,而不是让一个虚拟 Activity 重新启动您的原始 Activity,正确的方法是使用标志。

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

这些标志将清除您的后台堆栈,一直到您正在创建的任何 Activity 的第一个实例,它将杀死它,然后创建一个新实例。这基本上就是 ACR 的示例正在做的事情,但它更简洁。

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

希望这可以帮助!祝你好运!

于 2013-07-22T21:33:24.210 回答
1

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

Intent i = getBaseContext().getPackageManager()
             .getLaunchIntentForPackage(getBaseContext().getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
于 2016-10-18T07:20:53.903 回答
1

这是您需要做的:

  1. 创建粘性服务
  2. 使用来自服务的killProcess调用终止应用程序
  3. 然后粘性服务将重新启动,您可以使用getLaunchIntentForPackage意图打开您的应用程序

我喜欢使用 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 */);
    }
}
于 2018-01-17T14:44:21.070 回答
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。

于 2013-07-22T19:07:21.270 回答
0

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

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

于 2013-07-22T19:00:59.950 回答