android - 如何在异常时正确重启 Android 服务?

标签 android android-things

我正在尝试开发一个可以在异常情况下自动重启的 Android 服务。

  1. 我尝试在 onStartCommand 方法上添加 return START_STICKY;。但由于异常不会导致服务崩溃,因此不会自动重启。
  2. 我也尝试过How to restart service in android to call service oncreate again中提到的方法,就像把下面的代码放在一起,但是在 onDestory() 被调用之后,只有 onCreate() 被执行,而不是 onStartCommand()
    stopService(new Intent(this, YourService.class));
    startService(new Intent(this, YourService.class));
    

现在,服务看起来像这样:

public class PostService extends Service {

    site.bdsc.raspberry_gps_test.sim800Cutil.Sim800Manager Sim800Manager;
    private Thread thTestPost;
    private boolean mRunning;
    private static String TAG = "PostService";

    public PostService() {
    }

    @Override
    public void onCreate(){
        //get service
        thTestPost = new Thread(testPost,"testPost");
        Log.d(TAG,"Service on create");
    }

    @Override
    public int onStartCommand(Intent intent,int flags,int startId){
        if (!mRunning) {
            // Prevent duplicate service
            mRunning = true;
            Log.d(TAG,"Starting Post Service");
            try {
                Sim800Manager = Sim800ManagerImpl.getService("UART0");
            } catch (IOException e) {
                restartService(); //want to restart service here
            }
            thTestPost.start();
        }else{
            Log.d(TAG,"Duplicated Start Request!");
        }
        return START_STICKY;
    }
    @Override
    public void onDestroy(){
        super.onDestroy();
        Log.d(TAG,"Service on destory");
        mRunning = false;
        thTestPost.interrupt();
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private Runnable testPost = new Runnable() {
        @Override
        public void run() {
         // some code
        }
    };

    private void restartService(){
        stopService(new Intent(this, PostService.class));
        startService(new Intent(this,PostService.class));
    }
}

如代码所示,我希望 PostServiceIOException 被捕获时正确重启。

最佳答案

使用这个START_REDELIVER_INTENT

public static final int START_REDELIVER_INTENT

Constant to return from onStartCommand(Intent, int, int): if this service's process is killed while it is started (after returning from onStartCommand(Intent, int, int)), then it will be scheduled for a restart and the last delivered Intent re-delivered to it again via onStartCommand(Intent, int, int).

关于android - 如何在异常时正确重启 Android 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55830886/

相关文章:

java - IPackageStatsObserver 无法解析为类型 (Android)

安卓 SQLite : Replace old database with a new one or use migration scripts

Android things 带 4 针双极升压电机

android - 将带有 Android Things 的 Raspberry PI 3 连接到 Arduino

raspberry-pi - 为什么按下一个按钮会同时触发处理程序

android - fragment 中难以捉摸的 NullPointerException 仅当针对 API 19 运行时(18 工作正常。)

javascript - AngularJs Cordova android 应用程序中输入字段的 4 位密码 PIN 验证

android - Phonegap IOS Android 如何保护APP和APK中的信息www

android - 使用 Android Things 通过 DHT11 读取温度

intel-edison - Intel Edison 上的 Android Things 固件在 Windows 10 系统上刷新失败