长期运行的Android服务仅在特定设备上运行

时间:2017-06-20 09:25:09

标签: java android service task

GENERAL

我做了很多关于如何使服务长时间运行的研究,我认为我已经成功了,但根本没有,因为我发现我的应用程序无法在特定设备上正常运行。 即使相应的活动关闭,我的服务也应该运行,所以我已经注册了一个BOOT_COMPLETED接收器并通过Alarm Manager启动我的服务。

调查结果

我的测试包括:

  • HUAWEI P7 / Android V6.0
  • HUAWEI P8 / Android V6.0
  • HUAWEI P9 / Android V7.0
  • NEXUS(仿真器)/ Android V6.0

在HUAWEI P9和Android Emulator上,服务在应用程序任务关闭后继续运行,服务甚至在启动设备后运行。 如果我手动终止服务,该服务甚至会重新启动。

在HUAWEI P7和P8上,每次我破坏任务时服务都会被破坏,并且它不会自动重启。我的启动接收器也没有启动我的服务。

SERVICE

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 */
        }
    }
}

RECEIVER

 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,但似乎这并没有解决我的问题,因为服务只是破坏而且不会在睡眠模式下自行启动。

1 个答案:

答案 0 :(得分:0)

我在测试另一个应用程序时巧合地找到了答案!

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

本主题介绍如何处理此问题: "Protected Apps" setting on Huawei phones, and how to handle it