如何从应用程序内重新启动Android应用程序

时间:2010-12-02 20:31:53

标签: android lifecycle

我需要在用户更改首选项时重新启动应用程序。清除堆栈对我没有帮助,因为这不会取消后端服务调用。我想杀死应用程序进程本身。我正在使用

Process.killProcess(Process.myPid());

它可以杀死应用程序。但我需要的是重新启动应用程序。意味着终止进程并触发新进程,以便应用程序再次重新开始。

有办法做到这一点吗?

提前致谢。

7 个答案:

答案 0 :(得分:5)

这不是人们应该在测试环境之外尝试做的事情。

那就是两个想法:

1)在不久的将来设置闹钟一段时间,然后杀死你的过程

2)启动其他东西(可能是一个小的本机进程或shell脚本)来检测你的死亡并通过意图重启你

你也可以尝试开除自己的意图然后快速死亡,但这听起来像潜在的竞争条件取决于实施。如果您从/ proc中获取了绑定器fd并在本机代码中执行了恶意操作,那么您可能能够以这样一种方式启动意图:应用程序在ioctl的返回时崩溃...

答案 1 :(得分:4)

Android不是为此而设计的,这不是“要求”。这是一个实现。究竟是什么要求?为什么你不能设计你的应用程序来处理偏好更改而不重启?这似乎是一个非常糟糕的解决方案。

答案 2 :(得分:2)

设计操作系统以便应用程序可以自行重启似乎是一个非常糟糕的主意。 Android操作系统需要免费终止进程以释放内存 - 如果应用程序可能会突然重启,释放的内存将再次用完。我同意Falmarri,你需要调查为什么你的应用程序无法动态处理偏好变化。

答案 3 :(得分:2)

由于您已完成查杀过程,因此要重新启动应用程序,请使用以下代码:

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

答案 4 :(得分:1)

如果您确实要重新启动活动,包括终止当前进程,请尝试以下代码。将它放在HelperClass或您需要的地方。

public static void doRestart(Context c) {
        try {
            //check if the context is given
            if (c != null) {
                //fetch the packagemanager so we can get the default launch activity 
                // (you can replace this intent with any other activity if you want
                PackageManager pm = c.getPackageManager();
                //check if we got the PackageManager
                if (pm != null) {
                    //create the intent with the default start activity for your application
                    Intent mStartActivity = pm.getLaunchIntentForPackage(
                            c.getPackageName()
                    );
                    if (mStartActivity != null) {
                        mStartActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        //create a pending intent so the application is restarted after System.exit(0) was called. 
                        // We use an AlarmManager to call this intent in 100ms
                        int mPendingIntentId = 223344;
                        PendingIntent mPendingIntent = PendingIntent
                                .getActivity(c, mPendingIntentId, mStartActivity,
                                        PendingIntent.FLAG_CANCEL_CURRENT);
                        AlarmManager mgr = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);
                        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
                        //kill the application
                        System.exit(0);
                    } else {
                        Log.e(TAG, "Was not able to restart application, mStartActivity null");
                    }
                } else {
                    Log.e(TAG, "Was not able to restart application, PM null");
                }
            } else {
                Log.e(TAG, "Was not able to restart application, Context null");
            }
        } catch (Exception ex) {
            Log.e(TAG, "Was not able to restart application");
        }
    }

这也将重新初始化jni类和所有静态实例。

答案 5 :(得分:0)

这是一个想法:

拥有的服务与其他组件(活动,服务......)的流程不同。

为了重新启动应用程序,请调用此服务,它将执行的操作是终止应用程序其他组件的进程,然后将意图发送到您希望转到的活动。

这只是一个想法,因为我从未测试过它。请告诉我它是否有效并更新问题以包含答案,如果它确实有效。

答案 6 :(得分:0)

如果这是一个可以控制设备的企业项目,则可以轻松安装第二个作为监视器的应用程序。我的一个客户端使用这样的监视程序应用程序来处理诸如夜间应用程序重启(出于奇怪,非技术原因)以及检查和安装自助服务(非Play商店)应用程序更新等事情。

但是如果你真的想在你的应用程序中使用它,你可以执行以下操作(包括上面的kill过程):

Process.killProcess(Process.myPid());
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 500 /* half a second*/,
       PendingIntent.getActivity(this, 0, new Intent(this, this.getClass()),
                                 Intent.FLAG_ACTIVITY_NEW_TASK));