Android:如果任务管理器终止,则重新调用应用程序

时间:2012-09-13 06:29:02

标签: android taskmanager

如果应用程序线程被任务管理器杀死,它将关闭。需要重新调用应用程序,就像它被其他应用程序或任务管理器杀死一样。有什么想法吗?

5 个答案:

答案 0 :(得分:4)

您必须使用START_STICKY命令运行后台服务。 只需扩展Service并覆盖onCommand,如下所示:

@Override
public int onStartCommand(Intent intent,int flags,int startId) {
    super.onStartCommand(intent, flags, startId);

    return START_STICKY;
}

像这样,您的服务在关闭时(按系统或其他任何方式)重新启动

如果应用程序正在运行,您现在已经检查了您的服务(例如onCreate),如果没有,则再次启动它。我想PackageManager允许你检查这个或者只是放一个静态布尔值is_alive来查看你的活动是否一直在运行。

此致 吉姆

答案 1 :(得分:3)

Bug in Android 2.3 with START_STICKY

我需要用我所有的力量来维持服务。如果服务随时都在运行,您可以弹出UI。

onDestroy()

它将重新启动。

无法卸载应用,因为它有设备管理员。

这是一种家长控制,用户知道它在那里。 只有停止的方法是删除设备管理员,然后将其卸载,但删除设备管理员会将手机锁定为卡巴斯基如何操作。

有一些braodcast接收器,比如开机,用户presen,屏幕开启,屏幕关闭...等等,所有启动服务,你也可以用UI做。或者在服务中检查您的活动是否存活,如果不存在,则可见,而不是弹出它。

我希望你能充分利用这些信息!

编辑:重新启动服务代码段:

    // restart service:
    Context context = getApplicationContext();
    Intent myService = new Intent(context, MyService.class);
    context.startService(myService);

Edit2:添加spippet以检查服务是否正在运行...加载广播

   public static  boolean isMyServiceRunning(Context context) {
        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (MyService.class.getName().equals(service.service.getClassName())) {
                Log.d("myTag", "true");
                return true;
            }
        }
        Log.d("myTag", "false");
        return false;
    }

Edit3其他服务开始:

   public static void startTheService(Context context) {
         Intent myService = new Intent(context, MyService.class);
         context.startService(myService);
   }

不要忘记Android 2.3错误:在

中执行初始化逻辑
@Override
public void onCreate()

而不是:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)

答案 2 :(得分:2)

在查看Google IO官方产品源代码时,我发现了以下内容

((AlarmManager) context.getSystemService(ALARM_SERVICE))
            .set(
                    AlarmManager.RTC,
                    System.currentTimeMillis() + jitterMillis,
                    PendingIntent.getBroadcast(
                            context,
                            0,
                            new Intent(context, TriggerSyncReceiver.class),
                            PendingIntent.FLAG_CANCEL_CURRENT));

URL for code

你可以启动一个粘性服务并注册一个警报管理器,它会一次又一次地检查你的应用程序是否处于活动状态,如果没有那么它将运行它。

你也可以制作一个接收器并为<action android:name="android.intent.action.BOOT_COMPLETED" />注册它,然后你可以从接收器开始服务。我认为在操作系统或杀死某些服务/应用程序时应该有一些广播消息。

只是为了给你一个粗略的想法,我已经完成了这项工作 1)注册接收器 接收者代码:

@覆盖     public void onReceive(Context context,Intent intent){

    try {
        this.mContext = context;
        startService(intent.getAction());

        uploadOnWifiConnected(intent);

    } catch (Exception ex) {
        Logger.logException(ex);
        Console.showToastDelegate(mContext, R.string.msg_service_starup_failure, Toast.LENGTH_LONG);
    }
}

private void startService(final String action) {
    if (action.equalsIgnoreCase(ACTION_BOOT)) {

        Util.startServiceSpawnProcessSingelton(mContext, mConnection);

    } else if (action.equalsIgnoreCase(ACTION_SHUTDOWN)) {

    }
}

服务代码:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Logger.logInfo("Service Started onStartCommand");
    return Service.START_STICKY;
}

我更喜欢在onStartCommand中不做任何事情,因为每次启动服务时都会调用它但是onCreate只被称为第一次启动服务,所以我在onCreate中执行了大部分代码,这样我真的不关心天气服务已经开始运行。

答案 3 :(得分:1)

根据谷歌的@RetoMeyer,解决方案是让应用程序“粘性”。

为此,您必须在意向服务管理中建立START_STICKY。

检查this reference from developer android

答案 4 :(得分:0)

是的,一旦内存低问题到来,android os开始查杀应用程序以补偿所需的内存。使用服务可以实现这一点,您的服务应该与您的应用程序并行运行,但是,有些情况甚至您的服务也会同时被杀死。杀死后如果内存足够android os本身尝试重启应用程序而不是在所有情况下。最后,在所有依赖于os和内部行为的情况下,一旦被os杀死,重新调用你的应用程序就没有硬性规定。