如果应用程序线程被任务管理器杀死,它将关闭。需要重新调用应用程序,就像它被其他应用程序或任务管理器杀死一样。有什么想法吗?
答案 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));
你可以启动一个粘性服务并注册一个警报管理器,它会一次又一次地检查你的应用程序是否处于活动状态,如果没有那么它将运行它。
你也可以制作一个接收器并为<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。
答案 4 :(得分:0)
是的,一旦内存低问题到来,android os开始查杀应用程序以补偿所需的内存。使用服务可以实现这一点,您的服务应该与您的应用程序并行运行,但是,有些情况甚至您的服务也会同时被杀死。杀死后如果内存足够android os本身尝试重启应用程序而不是在所有情况下。最后,在所有依赖于os和内部行为的情况下,一旦被os杀死,重新调用你的应用程序就没有硬性规定。