我做了很多关于如何使服务长时间运行的研究,我认为我已经成功了,但根本没有,因为我发现我的应用程序无法在特定设备上正常运行。 即使相应的活动关闭,我的服务也应该运行,所以我已经注册了一个BOOT_COMPLETED接收器并通过Alarm Manager启动我的服务。
我的测试包括:
在HUAWEI P9和Android Emulator上,服务在应用程序任务关闭后继续运行,服务甚至在启动设备后运行。 如果我手动终止服务,该服务甚至会重新启动。
在HUAWEI P7和P8上,每次我破坏任务时服务都会被破坏,并且它不会自动重启。我的启动接收器也没有启动我的服务。
public class QuestionService extends Service {
/* Attributes */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
/* Some Code*/
new QuestionTask().execute();
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
stopSelf();
}
private class QuestionTask extends AsyncTask<Void, Long, Void> {
@Override
protected Void doInBackground(Void... params) {
/* Task to be executed periodically */
return null;
}
@Override
protected void onProgressUpdate(Long... values) {
super.onProgressUpdate(values);
/* gets periodically called and executes some code */
}
}
}
public class DeviceBootReceiver extends BroadcastReceiver {
private static final long REPEAT_TIME = 1000 * 30;
private SharedPreferences sp;
@Override
public void onReceive(Context context, Intent intent) {
sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
//if(!sp.getBoolean("firstStart",true)) {
/* AppActivationService starten */
AlarmManager service = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
Calendar cal = Calendar.getInstance();
// start 15 seconds after boot completed
cal.add(Calendar.SECOND, 15);
/* QuestionService starten */
Intent iq = new Intent(context, QuestionStartReceiver.class);
PendingIntent quest = PendingIntent.getBroadcast(context, 0, iq, PendingIntent.FLAG_CANCEL_CURRENT);
service.setInexactRepeating(AlarmManager.RTC_WAKEUP,
cal.getTimeInMillis(), REPEAT_TIME, quest);
//}
}
}
QuestionStartReceiver:
public class QuestionStartReceiver extends BroadcastReceiver {
public QuestionStartReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, QuestionService.class);
context.startService(i);
}
}
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".receiver.QuestionStartReceiver" />
<receiver android:name=".receiver.DeviceBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service android:name=".services.QuestionService"
android:exported="false" />
我也尝试过使用WakeLocker,但似乎这并没有解决我的问题,因为服务只是破坏而且不会在睡眠模式下自行启动。
答案 0 :(得分:0)
我在测试另一个应用程序时巧合地找到了答案!
HUAWEI有一个名为&#34;受保护的应用程序&#34;的内置功能。当主进程被销毁时,系统将终止未标记为受保护的已安装应用程序(以及所有相应的服务)。将我的申请标记为&#34;受保护&#34;解决了我的问题,现在每个服务都在后台运行,即使在手动终止我的应用程序之后也是如此。
本主题介绍如何处理此问题: "Protected Apps" setting on Huawei phones, and how to handle it