簡體   English   中英

我希望我的服務和廣播接收器能夠運行,即使從應用列表中清除了該應用或強制停止了該應用

[英]I want my service and broadcast receiver to run even if app is cleared from app list or forced stop

我希望我的服務和廣播接收器在后台運行,即使應用已關閉或強制停止也是如此。

我的接收器正在檢測響應屏幕並正在執行任務。 當應用程序打開且應用程序在應用程序列表中但未關閉時,其工作正常。 當我從應用程序列表中清除該應用程序時,它沒有檢測到響應屏幕。 我已經嘗試了許多方法,但無法成功。 幫幫我。

清單文件:-

<receiver
        android:name=".broadcastReceiver.MyReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.SCREEN_OFF"/>
            <action android:name="android.intent.action.SCREEN_ON"/>
        </intent-filter>
    </receiver>

    <service
        android:name=".service.MyService"
        android:enabled="true"
        android:exported="true"
        android:stopWithTask="false">

    </service>

MyService類別:-

private var myReceiver:MyReceiver?=null

private var defaultUEH:Thread.UncaughtExceptionHandler?=null
private var uncaughtExceptionHandler = object:Thread.UncaughtExceptionHandler{

    override fun uncaughtException(thread: Thread?, ex: Throwable?) {

        Log.d("Exception found","Uncaught exception start!")
        ex!!.printStackTrace()

        unregisterReceiver(myReceiver)

        var intent = Intent(applicationContext, MyService::class.java)
        intent.setPackage(packageName)
        var pendingIntent = PendingIntent.getService(applicationContext,1,intent,PendingIntent.FLAG_ONE_SHOT)
        var alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
        alarmManager.set(AlarmManager.ELAPSED_REALTIME,SystemClock.elapsedRealtime()+1000,pendingIntent)
        System.exit(2)

    }

}

override fun onBind(intent: Intent): IBinder? {
   return null
}

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

    var intentFilter = IntentFilter("android.intent.action.SCREEN_OFF")
    intentFilter.addAction("android.intent.action.SCREEN_ON")

    myReceiver = MyReceiver()
    registerReceiver(myReceiver , intentFilter)

    return START_STICKY
}

override fun onCreate() {
    super.onCreate()
    Log.d("Service" , "onCreate fun")
}

override fun onDestroy() {

    super.onDestroy()

    Log.d("Service" , "onDestroy fun")
}

override fun onTaskRemoved(rootIntent: Intent?) {

    unregisterReceiver(myReceiver)

    var intent = Intent(applicationContext, MyService::class.java)
    intent.setPackage(packageName)
    var pendingIntent = PendingIntent.getService(this,1,intent,PendingIntent.FLAG_ONE_SHOT)
    var alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
    alarmManager.set(AlarmManager.ELAPSED_REALTIME,SystemClock.elapsedRealtime()+1000,pendingIntent)
    super.onTaskRemoved(rootIntent)

}

MyReceiver類:-

override fun onReceive(context: Context?, intent: Intent?) {

    Log.d("Where ","Broadcast")
    if (intent!!.action.equals(Intent.ACTION_SCREEN_ON)){

        var dashboardActivity = DashboardActivity.instance
        var isSosEnabled = dashboardActivity!!.getSos()

        if (isSosEnabled){
            Log.d("Service Sos Enabled","True")
        }else{
            Log.d("Service Sos Enabled", "False")
        }
    }

}

您可以在主應用中使用服務啟動/停止服務

Intent service = new Intent(context, MyService.class);
context.startService(service);
...
Intent service = new Intent(context, MyService.class);
context.stopService(service);

服務

public class MyService extends Service
{
 private static BroadcastReceiver m_ScreenOffReceiver;

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

 @Override
 public void onCreate()
 {
  registerScreenOffReceiver();
 }

 @Override
 public void onDestroy()
 {
  unregisterReceiver(m_ScreenOffReceiver);
  m_ScreenOffReceiver = null;
 }

 private void registerScreenOffReceiver()
 {
  m_ScreenOffReceiver = new BroadcastReceiver()
  {
   @Override
   public void onReceive(Context context, Intent intent)
   {
     Log.d(TAG, "ACTION_SCREEN_OFF");
     // do something, e.g. send Intent to main app
   }
  };
  IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
  registerReceiver(m_ScreenOffReceiver, filter);
 }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM