如何防止服务终止?



MainActivity.java

import android.content.Intent;
import android.os.Bundle;
import android.support.wearable.activity.WearableActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends WearableActivity {
private TextView mTextView;
private static MainActivity instance;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextView = (TextView) findViewById(R.id.text);
    // Enables Always-on
    setAmbientEnabled();
    final TextView text = findViewById(R.id.text);
    text.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (text.getText().toString().equals("Started")) {
                text.setText("Stoped");
                stopService(new Intent(MainActivity.this,service.class));
            } else {
                text.setText("Started");
                startService(new Intent(MainActivity.this,service.class));
            }
        }
    });
}
public static MainActivity getInstance() {
    return instance;
}
public void showToast(String toastMsg){
    Toast.makeText(MainActivity.this, toastMsg, Toast.LENGTH_SHORT).show();
}
}

服务.java

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.MainThread;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class service extends Service {
private boolean started = false;
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("serviceTest", "Service started by user.");
    start();
    return START_STICKY;
}
@Override
public void onDestroy() {
    //Toast.makeText(this, "Service destroyed by user.", Toast.LENGTH_LONG).show();
    Log.i("serviceTest", "Service destroyed by user.");
    stop();
    super.onDestroy();
}


private Timer timer;
private TimerTask timerTask = new TimerTask() {
    @Override
    public void run() {
        if(started) {
            start();
        }
        Log.i("serviceTest", "ServiceCalled!");
    }
};
public void start() {
    if(timer != null) {
        return;
    }
    timer = new Timer();
    timer.scheduleAtFixedRate(timerTask, 0, 10000);
}
public void stop() {
    timer.cancel();
    timer = null;
}
}

代码运行正常大约 13 或 14 次(即计时器继续运行大约 13 或 14 次(,但突然服务停止并调用 onDestroy。 此外,在调试过程中,我注意到一个奇怪的情况:如果我从代码中删除/注释 onDestroy(( 方法,那么服务将始终运行。它永远不会自行关闭。(它仅在用户输入时关闭,这很好(

请提出一个解决方案,以免服务被杀死/破坏。或者,如果操作系统/系统杀死了它,则服务会自行重新启动。

谢谢

您必须将该后台服务转换为前台服务,因为从 android Oreo 开始的称为后台执行限制的限制。

请查看此链接以更好地了解:https://developer.android.com/about/versions/oreo/background

最新更新