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 警报管理器在重新启动设备或从后台杀死应用程序后取消