Java 长时间运行的Android服务仅在特定设备上运行 一般的

Java 长时间运行的Android服务仅在特定设备上运行 一般的,java,android,service,task,Java,Android,Service,Task,我做了很多关于如何使服务长期运行的研究,我认为我已经成功了,但一点也没有,因为我发现我的应用程序不能在特定设备上正确运行。 即使相应的活动关闭,我的服务也应该运行,因此我已经注册了一个引导完成的接收器,并通过Alarm Manager启动我的服务 调查结果 我的测试包括: 华为P7/Android V6.0 华为P8/Android V6.0 华为P9/Android V7.0 NEXUS(仿真器)/Android V6.0 在华为P9和Android Emulator上,该服务在应用程序任

我做了很多关于如何使服务长期运行的研究,我认为我已经成功了,但一点也没有,因为我发现我的应用程序不能在特定设备上正确运行。 即使相应的活动关闭,我的服务也应该运行,因此我已经注册了一个引导完成的接收器,并通过Alarm Manager启动我的服务

调查结果 我的测试包括:

  • 华为P7/Android V6.0
  • 华为P8/Android V6.0
  • 华为P9/Android V7.0
  • NEXUS(仿真器)/Android V6.0
在华为P9和Android Emulator上,该服务在应用程序任务关闭后继续运行,甚至在设备启动后也会运行。 如果我手动终止服务,服务甚至会自动重新启动

在华为P7和P8上,每次我销毁任务时,服务都会被销毁,并且不会重新启动。我的启动接收器也不能启动我的服务

服务
公共类问题服务扩展服务{
/*属性*/
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
/*一些代码*/
新问题任务().execute();
返回开始时间不粘;
}
@凌驾
公共IBinder onBind(意向){
返回null;
}
@凌驾
公共空间{
super.ondestory();
stopSelf();
}
私有类QuestionTask扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…参数){
/*要定期执行的任务*/
返回null;
}
@凌驾
受保护的void onProgressUpdate(长…值){
super.onProgressUpdate(值);
/*定期调用并执行某些代码*/
}
}
}
接受者
公共类设备BootReceiver扩展了BroadcastReceiver{
专用静态最终长重复时间=1000*30;
私人共享参考sp;
@凌驾
公共void onReceive(上下文、意图){
sp=context.getSharedReferences(“config”,context.MODE\u PRIVATE);
//如果(!sp.getBoolean(“firstStart”,true)){
/*AppActivationService starten*/
AlarmManager服务=(AlarmManager)上下文
.getSystemService(Context.ALARM\u服务);
Calendar cal=Calendar.getInstance();
//启动完成15秒后启动
计算添加(日历秒,15);
/*问题服务starten*/
意向iq=新意向(上下文、问题StartReceiver.class);
PendingEvent quest=PendingEvent.getBroadcast(上下文,0,iq,PendingEvent.FLAG_CANCEL_CURRENT);
service.setInexactRepeating(AlarmManager.RTC_唤醒,
cal.getTimeInMillis(),重复时间,任务);
//}
}
}
问题StartReceiver:

显示


我也尝试过使用WakeLocker,但似乎这并不能解决我的问题,因为这些服务只是在睡眠模式下进行破坏而不会启动。

我刚刚在测试另一个应用程序时偶然发现了答案

华为有一个内置功能,叫做“受保护的应用程序”。当主进程被销毁时,未标记为受保护的已安装应用程序(以及所有相应的服务)将被系统终止。将我的应用程序标记为“受保护”解决了我的问题,现在每个服务都在后台运行,即使是在手动终止我的应用程序之后

本主题介绍如何处理这场斗争:

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" />