簡體   English   中英

后台執行服務

[英]Background and foreground Service For Execution

我陷入一個問題,我需要在后台計算一些並發計算,並在每次執行完成時通知用戶。

我讀了很多文章。 在其中找到了服務類,意圖服務等。 但是我發現24個以上android os版本以上的崩潰。

如今,哪種方法最適合在android中執行后台服務,為什么?

對於上述問題,您可以使用工作管理器。 為了更好的理解,請查看以下鏈接

https://developer.android.com/topic/libraries/architecture/workmanager

執行后台服務的最佳方法是使用系統AlarmManager類,並每隔XXX秒調用一次警報,但這會耗費更多精力,但解決方案一定會為您服務。 遵循,

  1. 創建警報
    public static void setUpalarm(Context context) {
        Intent intent = new Intent(context, RestartServiceFromTimer.class);
        final PendingIntent pIntent = PendingIntent.getBroadcast(context , 0,
                intent,0);
        // Setup periodic alarm every every half hour from this point onwards
        long firstMillis = System.currentTimeMillis(); // alarm is set right away
        AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        // First parameter is the type: ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC_WAKEUP
        // Interval can be INTERVAL_FIFTEEN_MINUTES, INTERVAL_HALF_HOUR, INTERVAL_HOUR, INTERVAL_DAY
        long delay = 5 * 1000 * 60; // time sets to 5 minute change accordingly
        long time = System.currentTimeMillis() + delay;

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
            alarm.set(AlarmManager.RTC_WAKEUP, time, pIntent);
        else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
            alarm.setExact(AlarmManager.RTC_WAKEUP, time, pIntent);
        else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarm.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pIntent);
        }

2創建廣播接收器並再次重啟服務,並再次安排警報

    public class RestartServiceFromTimer extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("Task Trigger","Task is triggered");
        if(!isMyServiceRunning(DetectIncomonCallService.class,context.getApplicationContext()))
        { Intent myserviceIntent = new Intent(context.getApplicationContext(),Service.class);
            //start your background service here
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O)
            {
                ContextCompat.startForegroundService(context.getApplicationContext(),myserviceIntent);//this is for forground service


            }
            else
            {
                context.startService(myserviceIntent);
            }
        }
        MainActivity.setUpalarm(context.getApplicationContext());
    }
    private boolean isMyServiceRunning(Class<?> serviceClass,Context context) {
        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }
}

像這樣從主要活動中調用3種方法

setUpalarm(MainActivity.this)

您可以將Foreground Service用於android OREO和更高版本,而對於低於OREO Android版本,則可以使用后台STICKY,NON_STICKEY服務 計算完成后,您可以從該服務中廣播帶有價值的操作。

暫無
暫無

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

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