运行长任务时,前台服务停止

时间:2018-10-25 11:05:45

标签: android foreground-service

我有一个前台服务,该服务应一次执行长时间运行(约20分钟)的任务(使用蓝牙进行文件传输)。但是,该服务会在一段时间后停止。

作为一个再现问题的简单测试应用程序,我首先进行了以下活动:

public class MainActivity extends AppCompatActivity {

    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            TestService serv = ((TestService.TestServiceBinder) service).getService();
            serv.startLongProcess();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent i = new Intent(this, TestService.class);
        ContextCompat.startForegroundService(this, i);
        bindService(i, connection, Service.BIND_AUTO_CREATE);
    }
}

然后是服务:

public class TestService extends Service {

    private static final String TAG = "TestService";

    public static class TestServiceBinder extends Binder {
        private final TestService service;

        public TestServiceBinder(TestService service) {
            this.service = service;
        }

        public TestService getService() {
            return service;
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new TestServiceBinder(this);
    }

    @Override
    public void onCreate() {
        super.onCreate();

        NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            nm.createNotificationChannel(new NotificationChannel("channel", "channel", NotificationManager.IMPORTANCE_LOW));
        }

        startForeground(42, new NotificationCompat.Builder(this, "channel")
                .setContentTitle("Title")
                .setContentText("Content")
                .setSmallIcon(R.drawable.ic_launcher_foreground)
                .setOngoing(true)
                .build());
    }

    public void startLongProcess() {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "com.example.longrunningproject");
        wakeLock.acquire(1000 * 60 * 30);
        new Thread(() -> {
            int i = 0;
            while (true) {
                Log.d(TAG, "Doing work: " + i);
                i++;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

现在,我启动了该应用程序,但是它在后台运行(通知仍然存在)并关闭了屏幕。当我观察logcat输出时,看到以下内容:

2018-10-25 13:58:26.982 10768-10794/com.example.longrunningproject D/TestService: Doing work: 964
2018-10-25 13:58:28.027 10768-10794/com.example.longrunningproject D/TestService: Doing work: 965
2018-10-25 13:58:29.068 10768-10794/com.example.longrunningproject D/TestService: Doing work: 966
2018-10-25 13:58:29.552 886-1358/? V/AlarmManager: Triggering alarm #0: 2 when =3493022 package =android operation = null listenTag =*job.delay* flags =0x0
2018-10-25 13:58:30.114 10768-10794/com.example.longrunningproject D/TestService: Doing work: 967
2018-10-25 13:58:31.157 10768-10794/com.example.longrunningproject D/TestService: Doing work: 968
2018-10-25 13:58:32.198 10768-10794/com.example.longrunningproject D/TestService: Doing work: 969
2018-10-25 13:58:33.242 10768-10794/com.example.longrunningproject D/TestService: Doing work: 970
2018-10-25 13:58:34.287 10768-10794/com.example.longrunningproject D/TestService: Doing work: 971
2018-10-25 13:58:34.655 886-11349/? E/OHPD: [BgDetect] AppForkedProc kworker/2:0H pid 11129 uid 0 can't find pkgName
2018-10-25 13:58:35.330 10768-10794/com.example.longrunningproject D/TestService: Doing work: 972
2018-10-25 13:58:36.374 10768-10794/com.example.longrunningproject D/TestService: Doing work: 973
2018-10-25 13:58:37.419 10768-10794/com.example.longrunningproject D/TestService: Doing work: 974
2018-10-25 13:58:37.869 4682-4697/? I/Finsky: [50] com.google.android.finsky.bo.ad.run(6): Stats for Executor: BlockingExecutor com.google.android.finsky.bo.ae@5d7ffa9[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 6]
2018-10-25 13:58:37.871 4682-4697/? I/Finsky: [50] com.google.android.finsky.bo.ad.run(6): Stats for Executor: LightweightExecutor com.google.android.finsky.bo.ae@293892e[Running, pool size = 4, active threads = 0, queued tasks = 0, completed tasks = 44]
2018-10-25 13:58:37.872 4682-4697/? I/Finsky: [50] com.google.android.finsky.bo.ad.run(6): Stats for Executor: bgExecutor com.google.android.finsky.bo.ae@4319ccf[Running, pool size = 4, active threads = 0, queued tasks = 0, completed tasks = 8]
2018-10-25 13:58:38.464 10768-10794/com.example.longrunningproject D/TestService: Doing work: 975
2018-10-25 13:58:39.490 10768-10794/com.example.longrunningproject D/TestService: Doing work: 976
2018-10-25 13:58:39.983 11212-11232/? W/CrashLoopRemedyLog: unable to delete remedy log, instaCrash: true
2018-10-25 13:58:40.535 10768-10794/com.example.longrunningproject D/TestService: Doing work: 977
2018-10-25 13:58:41.580 10768-10794/com.example.longrunningproject D/TestService: Doing work: 978
2018-10-25 13:58:42.625 10768-10794/com.example.longrunningproject D/TestService: Doing work: 979
2018-10-25 13:58:43.669 10768-10794/com.example.longrunningproject D/TestService: Doing work: 980
2018-10-25 13:58:44.714 10768-10794/com.example.longrunningproject D/TestService: Doing work: 981
2018-10-25 13:58:45.735 10768-10794/com.example.expell.longrunningproject D/TestService: Doing work: 982
2018-10-25 13:58:46.752 10768-10794/com.example.longrunningproject D/TestService: Doing work: 983
2018-10-25 13:58:47.773 10768-10794/com.example.longrunningproject D/TestService: Doing work: 984
2018-10-25 13:58:48.794 10768-10794/com.example.longrunningproject D/TestService: Doing work: 985
2018-10-25 13:58:48.938 911-1030/? I/ThermalEngine: Monitor : quiet_therm = 28899, msm_therm = 29311, xo_therm = 29403, battery_therm = 283,current_now = -442000 
2018-10-25 13:58:49.804 10768-10794/com.example.longrunningproject D/TestService: Doing work: 986
2018-10-25 13:58:52.887 886-1358/? V/AlarmManager: Triggering alarm #0: 3 when =3516357 package =com.google.android.gms operation =*alarm*:com.google.android.gms/.lockbox.LockboxAlarmReceiver flags =0x0
2018-10-25 13:59:00.004 886-1358/? V/AlarmManager: Triggering alarm #0: 3 when =3523475 package =android operation =*alarm*:android.intent.action.TIME_TICK flags =0x1
2018-10-25 13:59:35.512 886-1358/? V/AlarmManager: Triggering alarm #0: 2 when =3558982 package =com.google.android.gms operation =*walarm*:com.google.android.gms.gcm.HEARTBEAT_ALARM flags =0x5
2018-10-25 13:59:35.545 748-970/? D/AudioPolicyService: setRecordSilenced() uid 99910027 on silenced 0
2018-10-25 13:59:35.551 2408-8056/? E/WakeLock: GCM_HB_ALARM release without a matched acquire!
2018-10-25 13:59:35.867 709-2516/? I/WifiHAL: event received NL80211_CMD_VENDOR, vendor_id = 0x1374, subcmd = 0xa
2018-10-25 13:59:35.870 2496-2496/? I/wpa_supplicant: wlan0: CTRL-EVENT-AVOID-FREQ ranges=5180-5320,5500-5640
2018-10-25 13:59:35.871 2496-2496/? I/wpa_supplicant: wlan0: CTRL-EVENT-AVOID-FREQ ignore
2018-10-25 13:59:37.902 4682-4697/? I/Finsky: [50] com.google.android.finsky.bo.ad.run(6): Stats for Executor: BlockingExecutor com.google.android.finsky.bo.ae@5d7ffa9[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 6]
2018-10-25 13:59:37.903 4682-4697/? I/Finsky: [50] com.google.android.finsky.bo.ad.run(6): Stats for Executor: LightweightExecutor com.google.android.finsky.bo.ae@293892e[Running, pool size = 4, active threads = 0, queued tasks = 0, completed tasks = 44]
2018-10-25 13:59:37.904 4682-4697/? I/Finsky: [50] com.google.android.finsky.bo.ad.run(6): Stats for Executor: bgExecutor com.google.android.finsky.bo.ae@4319ccf[Running, pool size = 4, active threads = 0, queued tasks = 0, completed tasks = 8]
2018-10-25 13:59:40.722 886-893/? W/System: A resource failed to call close. 
2018-10-25 13:59:48.953 911-1030/? I/ThermalEngine: Monitor : quiet_therm = 28899, msm_therm = 29266, xo_therm = 29403, battery_therm = 284,current_now = -443000 
2018-10-25 13:59:52.732 886-1358/? V/AlarmManager: Triggering alarm #0: 1 when =1540465192731 package =android operation =*alarm*:com.oneplus.android.screenOffCheckProcessState flags =0x9
2018-10-25 14:00:00.000 886-1358/? V/AlarmManager: Triggering alarm #0: 3 when =3583475 package =android operation =*alarm*:android.intent.action.TIME_TICK flags =0x1
2018-10-25 14:00:01.004 886-1358/? V/AlarmManager: Triggering alarm #0: 1 when =1540465201000 package =com.oneplus.deskclock operation =*alarm*:com.android.deskclock.ON_QUARTER_HOUR flags =0x1
2018-10-25 14:00:27.192 886-1358/? V/AlarmManager: Triggering alarm #0: 3 when =3610662 package =android operation =*alarm*:android/com.android.server.stats.StatsCompanionService$PullingAlarmReceiver flags =0x9
2018-10-25 14:00:27.922 692-754/? E/CHRE: Couldn't connect client socket to 'chre': Connection refused
2018-10-25 14:00:27.925 692-754/? W/CHRE: Failed to (re)connect, next try in 300000 ms

因此,基本上在运行16分钟后,一切都停止了。在另一次运行中,它在5分钟后停止了运行。当屏幕重新打开时(即使未将活动置于前台),该服务将继续执行。如何在整个操作过程中使服务正常运行?

0 个答案:

没有答案