首页 文章

应用程序被杀后,广播接收器未调用服务

提问于
浏览
1

我的目标是 Restarting the Service 当应用程序处于后台或甚至通过扫描从主页中杀死 . 应用程序处于前台和后台时应用程序和服务工作正常,但是当我用力杀死应用程序(从主页扫出)时, Service 停止工作 . 这没关系,但我实现了 Broadcast Receiver 来重启 Service ,但似乎 its (Broadcast Receiver) 甚至没有被称为 itselfService 而应用程序被强行杀死/从主页扫除 .

我的设备是: Xiaomi Redmi Note 4

我在这里包含了我的代码:

MainActivity.java

package com.turzo.servicetest;

import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private String TAG = "ServiceTest";
    Intent mServiceIntent;
    private SensorService mSensorService;

    Context ctx;

    public Context getCtx() {
        return ctx;
    }



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ctx = this;
        registerRec();
        setContentView(R.layout.activity_main);

        mSensorService = new SensorService(getCtx());
        mServiceIntent = new Intent(getCtx(), mSensorService.getClass());
        if (!isMyServiceRunning(mSensorService.getClass())) {
            startService(mServiceIntent);
        }

    }

    private boolean isMyServiceRunning(Class<?> serviceClass) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                Log.i (TAG, true+"");
                return true;
            }
        }
        Log.i (TAG, false+"");
        return false;
    }


    @Override
    protected void onDestroy() {
       stopService(mServiceIntent);
        Log.i(TAG, "onDestroy!");
        super.onDestroy();

    }

    public void registerRec(){


        SensorRestarterBroadcastReceiver myreceiver = new SensorRestarterBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver((BroadcastReceiver) myreceiver, intentFilter);
    }







}

SensorService.java

package com.turzo.servicetest;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

import java.util.Timer;
import java.util.TimerTask;


public class SensorService extends Service {
    public int counter=0;
    private String TAG = "ServiceTest";
    public SensorService(Context applicationContext) {
        super();
        Log.i(TAG , "here I am!");
    }

    public SensorService() {
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        startTimer();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG , "ondestroy!");
        Intent broadcastIntent = new Intent("com.turzo.servicetest.ActivityRecognition.RestartSensor");
        sendBroadcast(broadcastIntent);
        stoptimertask();
    }

    private Timer timer;
    private TimerTask timerTask;
    long oldTime=0;
    public void startTimer() {
        //set a new Timer
        timer = new Timer();

        //initialize the TimerTask's job
        initializeTimerTask();

        //schedule the timer, to wake up every 1 second
        timer.schedule(timerTask, 1000, 1000); //
    }

    /**
     * it sets the timer to print the counter every x seconds
     */
    public void initializeTimerTask() {
        timerTask = new TimerTask() {
            public void run() {
                Log.i(TAG , "in timer ++++  "+ (counter++));
            }
        };
    }

    /**
     * not needed
     */
    public void stoptimertask() {
        //stop the timer, if it's not already null
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


}

SensorRestarterBroadcastReceiver.java

package com.turzo.servicetest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;


public class SensorRestarterBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(SensorRestarterBroadcastReceiver.class.getSimpleName(), "Service Stops! Oooooooooooooppppssssss!!!!");

        context.startService(new Intent(context, SensorService.class));
    }

}

AndroidManifext.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.turzo.servicetest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <service
            android:name="com.turzo.servicetest.SensorService"
            android:enabled="true" >
        </service>

        <receiver
            android:name="com.turzo.servicetest.SensorRestarterBroadcastReceiver"
            android:enabled="true"
            android:exported="true"
            android:label="RestartServiceWhenStopped">
            <intent-filter>
                <action android:name="com.turzo.servicetest.ActivityRecognition.RestartSensor"/>
            </intent-filter>
        </receiver>


    </application>

</manifest>

1 回答

  • 1

    您应该在 onTaskRemoved() 中重新启动 Service .

    @Override
        public void onTaskRemoved(Intent rootIntent) {
            Intent restartService = new Intent(getApplicationContext(),
                    this.getClass());
            restartService.setPackage(getPackageName());
            PendingIntent restartServicePI = PendingIntent.getService(
                    getApplicationContext(), 1, restartService,
                    PendingIntent.FLAG_ONE_SHOT);
            AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
            alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePI);
        }
    

    NOTE:- 从android O开始 . 你不能叫 startService .

    如果针对Android 8.0的应用程序在不允许创建后台服务的情况下尝试使用该方法,则startService()方法现在会抛出IllegalStateException .

    这不适用于前景服务,这对用户来说是显而易见的 . 它可以在后台运行,并在顶部发布通知 . 默认情况下,这些限制仅适用于针对Android 8.0(API级别26)或更高级别的应用 . 但是,用户可以从“设置”屏幕为任何应用启用大多数这些限制,即使该应用针对的API级别低于26.因此,如果用户启用了以下API 26的限制,则 Service 将无效 .
    阅读Background Execution Limits .

    因此,尽量避免使用 Service . 如果符合要求,请使用WorkManager .

相关问题