【问题标题】:How to prevent a service from terminating?如何防止服务终止?
【发布时间】:2019-11-20 11:27:01
【问题描述】:

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();
}
}

Service.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() 方法,那么服务总是运行。它永远不会自行关闭。 (它只在用户输入时关闭,这很好)

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

谢谢

【问题讨论】:

  • 对于高于 7.0 的 android 版本,您应该使用 Jobservice 而不是 service
  • 不相关:Java 中的类名应为大写字母。 s服务不仅违反了该规则,而且它也是一个名称,它没有说明其中的代码。使用与读者交谈的名称。名称传达意图。 “服务”不传达任何信息。
  • @GhostCatsaysReinstateMonica NOTED 和 thnx

标签: java android android-service


【解决方案1】:

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

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

【讨论】:

  • 谢谢亚历克斯。使用 JobService 后将发布我的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多