[英]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.