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

Posted

技术标签:

【中文标题】Android:如果任务管理器杀死,则重新调用应用程序【英文标题】:Android: Re-invoke application if task manager kill 【发布时间】:2012-09-13 06:29:01 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您必须使用 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 来查看您的活动是否一直在运行。

问候 吉姆

【讨论】:

是的!调用并使用了您的 sn-p 但是当我手动强制关闭我的应用程序并且它不会重新调用时。还是一样 您的服务在您强制关闭应用程序之前正在运行?像这样在您的服务的 onCreate 方法中输入一个日志,您将看到它是否启动以及是否在关闭后再次启动 当然..我的服务一直有效,直到强制关闭和强制关闭后的服务理想..还以各种方式相应地使用了您的 sn-p。它使我的应用程序不理想但是当我强制关闭时..不起作用。谢谢! 不客气。通常,如果服务被强制关闭,则必须重新启动(由于 START_STICKY 标志,但可能不是在强制关闭后直接)如果服务已启动,如果没有我启动它。它可以成为您重新开始活动的解决方案。 不敢相信这是赞成票,如果您只使用 START_STICKY,我会立即终止您的服务和应用程序...我需要工作日才能获得“无法杀死”的服务【参考方案2】:

Bug in android 2.3 with START_STICKY

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

onDestroy()

它将重新启动。

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

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

有很多广播接收器,例如启动完成,用户呈现,屏幕开启,屏幕关闭......等等,所有启动服务,您也可以使用UI来完成。或者在服务中检查您的活动是否活跃、可见,如果没有,则弹出它。

希望您有充分的理由使用这些信息!

编辑:重启服务代码sn -p:

    // 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 的 bug:在

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

而不是:

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

【讨论】:

谢谢!但是根据这个post,由于android系统中的堆栈流,它不能保证 onDestroy() 。并尝试使用示例 onDestroy 重新启动应用程序。还是一样的。 onDestroy 它是许多尝试重新启动的 1,但没有人能保证,但在我的情况下,您不能杀死超过 2 分钟的服务 好的!谢谢..你能提供sn-p的代码或示例来使用onDestroy()方法 是的!已经使用这样的 sn-p 在设备启动时启动我的服务并正常工作。但正如我所说,当设备处于活动状态时,它不起作用。谢谢..如果我在我的代码中尝试使用 onDestroy() 方法(代码的 sn-p)可能会有所帮助。谢谢! 有,第一个,以//restart service开头【参考方案3】:

在查看 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 中完成大部分代码,这样我就不太关心天气了服务是否已经在运行。

【讨论】:

intent.getAction() 返回空值并使用 ACTION_VIEW 但仍然相同 +1,也许不是完美的代码,但想法不错,我使用了AlarmService,感谢您的想法。不像你建议的那样,但我可以找出热来完美地满足我的需求。我不需要鱼,只需要钓鱼技术;)【参考方案4】:

根据来自 Google 的 @RetoMeyer,解决方案是让应用“具有粘性”。

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

查看this reference from developer android

【讨论】:

它已经被 gim(jaumard) 和 Algo 定义了但是不起作用 我有许多使用此资源的应用程序正在运行,它们运行良好。 Reto Meyer 写了这本该死的书。字面上地。 :)【参考方案5】:

是的,一旦出现内存不足的问题,android os 就会开始杀死应用程序以补偿所需的内存。使用服务可以实现这一点,您的服务应该与您的应用程序并行运行,但请注意,在某些情况下,甚至您的服务也会同时被终止。如果内存足够,则杀死后,android os 本身会尝试重新启动应用程序,但并非在所有情况下都如此。最后,在所有情况下,一旦被操作系统杀死,重新调用您的应用程序并没有硬性规定,这取决于操作系统和内部行为。

【讨论】:

是的!但我看到一些应用程序被重新调用。 eg:GO sms我想知道,是要在代码中添加服务还是要授予权限。 这就是我所说的使用服务.. 参考这些链接:***.com/questions/4339556/…、***.com/questions/3041971/android-service-killed、***.com/questions/7257378/…、***.com/questions/9696861/….... 最好尝试锻炼,避免重新启动应用程序因为您的应用程序占用了太多内存,这足以被操作系统杀死。 感谢您的回复和链接...对不起..我的应用程序没有因为内存不足而被操作系统杀死。如果用户每次都使用第三方应用程序释放内存,它就会被杀死。 就像我在回答中所说的那样:使 Servive “无法杀死”。该服务将检查您的活动是否存在,如果没有则显示。简单地说,我不会提供数千行代码......但这里是如何

以上是关于Android:如果任务管理器杀死,则重新调用应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Android 警报管理器在重新启动设备或从后台杀死应用程序后取消

如果应用程序从任务管理器中被杀死,NSUrlSession 是不是会继续文件传输?

如何在应用程序被任务管理器杀死时保存数据?

用任务管理器杀死时如何防止内存泄漏[重复]

怎样使一个Android应用不被杀死

当应用被用户杀死时,工作管理器不工作。为啥?