Android O - 后台服务限制无法按预期工作

时间:2017-04-25 13:12:03

标签: java android android-service android-8.0-oreo

我只是根据Android O背景限制测试我现有的Android应用程序。

在测试中,我发现了一种奇怪的行为。所以基本上在我的应用程序中,我正在使用后台服务,我在第一次活动中启动它。

所以现在问题是一旦活动和后台服务开始,我正在使用后退按钮关闭我的活动。因此,根据服务概念,它会在后台运行。

大约1分钟onDestroy()方法被调用后台服务但服务仍在运行。理想情况下,根据文档,它应该被杀死。

所以,我不知道这是一个问题还是什么。

作为参考,我创建了一个反映相同场景的示例代码,如下所示:

步骤

  • 启动申请
  • 点击开始后台服务按钮。
  • 使用后退按钮关闭应用程序。

HomeActivity.java

package com.icpl.otest;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;

import com.icpl.otest.service.MyService;

public class HomeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }

    public void onStartServiceClick(View view) {
        Intent serviceIntent = new Intent(this, MyService.class);
        startService(serviceIntent);
    }
}

MyService.java

package com.icpl.otest.service;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    private static final String TAG = "MyService";

    private Handler mHandler;

    public MyService() {
        Log.i(TAG, "MyService constructor called.");
        mHandler = new Handler();
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand with intent:- " + intent);
        startShowingVisibility();
        return START_NOT_STICKY;
    }

    private void startShowingVisibility() {
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.i(TAG, "I am alive");
                startShowingVisibility();
            }
        }, 3000);
    }

    @Override
    public void onDestroy() {
        Log.i(TAG, "onDestroy()");
        super.onDestroy();
    }
}

1 个答案:

答案 0 :(得分:1)

  

大约1分钟后,onDestroy()方法被调用后台服务,但服务仍在运行

不,它没有。您的服务可能已启动的工作可能继续(在您的情况下,您的无限Handler“循环”)。但是,您的流程可能随时终止。