我已经在startforeground()
使用了Service
,但是当我清除所有最近的应用时,Android会一直杀死我的Service
。
以下是我的服务代码:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("Text")
.setTicker("Text")
.setContentText("Text")
.setSmallIcon(R.drawable.icon)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon))
.build();
startForeground(100, notification);
return START_STICKY;
}
我对这段代码有什么不对吗?
答案 0 :(得分:18)
长时间运行的服务需要以下内容才能使其不太可能被终止:
从START_STICKY
返回onStartCommand()
。有了这个,系统将重新启动服务,即使必须停止资源限制。
当服务未绑定到任何UI组件(例如,活动)时,服务必须通过显示前景通知进入前台模式。前台服务不太可能被系统终止。
在清单文件的相应<service>
标记中设置属性"stopWithTask"=false
。
另请注意,由于自定义,某些制造商的设备即使具有上述属性也会终止服务:
某些应用程序服务确实需要保留在后台,并且必须积极地保持活力。虽然不建议使用此方法,但可以执行以下步骤:
添加服务启动触发器:例如“引导完成”和“网络连接”广播。
如果服务在意图中收到意图/广播FLAG_RECEIVER_FOREGROUND
。
当AlarmManager
被调用时,manually schedule a pending intent for service重新开始START_STICKY does not work on Android KitKat极端度假。
另见,见:
答案 1 :(得分:7)
Android系统可以在他们想要停止维持设备性能或功耗时随时停止服务。有很多情况下android系统可以停止你的服务,如电池电量不足,app长时间不处于活动状态,设备处于休眠模式,省电模式等。
我开发了一个技巧或黑客(你可以这么说)使用没有人可以阻止你的服务(Android系统,第三方应用程序,用户)。
注意:使用此功能,您的服务永远不会停止,也可能耗尽您的电池。
请按照以下步骤操作: -
1)在onStartCommand中返回START_STICKY。
2)然后修改服务中的onDestroy()和onTaskRemoved()方法,如下所示:
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(getApplicationContext(), "Service Task destroyed", Toast.LENGTH_LONG).show();
Intent myIntent = new Intent(getApplicationContext(), YourService.class);
PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0);
AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 10);
alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show();
}
@Override
public void onTaskRemoved(Intent rootIntent) {
super.onTaskRemoved(rootIntent);
Intent myIntent = new Intent(getApplicationContext(), YourService.class);
PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0);
AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 10);
alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getApplicationContext(), "Service Starts", Toast.LENGTH_SHORT).show();
return START_STICKY;
}
这里每当服务停止时(通过android系统或用户手动)我都会设置一个警报,并且每次使用PendindIntent都会在10秒内重启服务。
答案 2 :(得分:3)
您可以使用START_REDELIVER_INTENT代替START_STICKY
对这些的最简单的解释可能是,
START_STICKY - 告诉系统在有足够内存可用时,从低内存中恢复后,创建该服务的全新副本。在这里,您将丢失之前可能计算过的结果。
START_NOT_STICKY - 告诉系统即使有足够的内存也不要费心重启服务。
START_REDELIVER_INTENT - 告诉系统在崩溃后重新启动服务,并重新发送崩溃时出现的意图。
我希望这会对你有所帮助。感谢
答案 3 :(得分:1)
华为,Vivo,Oppo和小米限制后台服务。 另请参阅here
修改: 在这些品牌中,由于大量的自定义,默认情况下限制所有服务。您必须通过设置禁用应用程序的背景限制,或者可以通过激发意图向用户提示。 不幸的是,每个操作系统中“后台限制”设置的路径都不相同。
private static final Intent[] POWERMANAGER_INTENTS = {
new Intent().setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")),
new Intent().setComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity")),
new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity")),
new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity")),
new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity")),
new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity")),
new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.startupapp.StartupAppListActivity")),
new Intent().setComponent(new ComponentName("com.oppo.safe", "com.oppo.safe.permission.startup.StartupAppListActivity")),
new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity")),
new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.BgStartUpManager")),
new Intent().setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity")),
new Intent().setComponent(new ComponentName("com.samsung.android.lool", "com.samsung.android.sm.ui.battery.BatteryActivity")),
new Intent().setComponent(new ComponentName("com.htc.pitroad", "com.htc.pitroad.landingpage.activity.LandingPageActivity")),
new Intent().setComponent(new ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.MainActivity"))
};
for (Intent intent : POWERMANAGER_INTENTS)
if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
// show dialog to ask user action
break;
}
答案 4 :(得分:0)
请阅读此Click Here
一些设备有自定义的android,而不是真正的android测试会在你清除最近的应用程序时终止你的服务