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

应用程序线程如果被任务pipe理器终止,则会closures。 需要重新调用应用程序,就好像被其他应用程序或任务pipe理器杀死一样。 任何想法?

Solutions Collecting From Web of "Android:如果任务pipe理器被终止,则重新调用应用程序"

您必须使用START_STICKY命令运行后台服务。 只是扩展服务,并像这样覆盖onCommand:

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

像这样,当服务closures时(系统或其他)

你现在只需要检查你的服务(例如onCreate),如果应用程序正在运行,如果没有运行,就再次启动它。 我想PackageManager让你检查这个,或者简单地把一个静态布尔is_alive来看看你的活动是否总是在运行。

问候吉姆

在Android 2.3与START_STICKY的错误

我需要我所有的力量保持一个服务。 如果服务随时可以运行,您可以popupUI。

 onDestroy() 

它将重新启动。

无法卸载应用程序,因为它有一个设备pipe理员。

这是一种家长控制,用户知道它在那里。 唯一的办法是取消设备pipe理,然后将其卸载,但是删除设备pipe理会将手机locking为卡巴斯基的方式。

有一些braodcast接收器,如启动,用户presen,屏幕上,屏幕closures,许多其他,所有启动服务,你也可以用它做UI。 或者在服务中检查你的活动是否活着,如果没有,则popup它。

我希望你会用很好的理由信息!

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

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

编辑2:添加片段,以检查服务是否正在运行…负载的广播

  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) 

在查看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

你可以启动一个粘性的服务,并注册一个警报pipe理器,它会一再检查你的应用程序是否活着,如果没有,那么它将运行它。

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

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

@Override 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,所以我在onCreate中执行了大部分代码,这样我就不会在乎天气服务了运行与否。

根据谷歌的@ReetMeyer,解决scheme是使应用程序“粘”。

为此,您必须在您的意向服务pipe理中build立START_STICKY。

从开发人员android检查这个参考

是的,一旦内存低的问题来了android操作系统开始杀应用程序来补偿所需的内存。 使用服务你可以达到这个目的,你的服务应该与你的应用程序并行运行,但是请看,有些情况下甚至你的服务也会同时被杀死。 杀死后,如果内存是足够的android操作系统本身尝试重新启动应用程序不是在所有情况下。 最后,没有硬性规定,在所有依赖os和内部行为的情况下,重新调用一次被os所杀的应用程序。