一、使用前台服務
前台服務是指實現了Notification的Service,在服務運行期間會在狀態欄顯示Notification。通過使用前台服務,可以使應用一直處於運行狀態,同時也能夠給用戶提供通知,防止應用因為後台進程被系統回收而被強制停止。
首先,在Service類中創建Notification實例:
Notification.Builder builder = new Notification.Builder(this); builder.setContentTitle("應用正在運行"); builder.setContentText("點擊返回應用"); builder.setSmallIcon(R.drawable.icon); Notification notification = builder.build(); startForeground(1, notification);
在startForeground()方法中的1表示通知的id號,這個數字不可變。
另外,為了使應用更好的運行,可以通過bindService()方法與activity綁定。這樣在activity銷毀時,service也會被立即銷毀。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent startIntent = new Intent(this, MyService.class); startService(startIntent); bindService(startIntent, connection, BIND_AUTO_CREATE); } private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { } @Override public void onServiceDisconnected(ComponentName name) { } }; }
二、採用不同方式的Alarm機制
系統針對Alarm機制有兩種方式可供選擇:一種是使用系統AlarmManager,另一種是自己維護一個定時器。
對於前一種方式,通過定時啟動定製化廣播來完成周期性任務。示例代碼如下:
public class AlarmActivity extends AppCompatActivity { AlarmManager alarmManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_alarm); alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, AlarmReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0); alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 10*1000, pi); } } public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // do something } }
對於後一種方式,可以使用Handler和TimerTask實現:
public class TimerActivity extends AppCompatActivity { Timer timer; long delay = 0; long inteval = 30 * 1000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_timer); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { // do something } }, delay, inteval); } }
三、使用JobScheduler
Android 5.0以上版本系統提供了一種新的JobScheduler API,可用於執行短期任務和周期性任務。JobScheduler有以下特點:
- 最小化了對資源的使用,避免對電池和數據連接的影響
- 系統可以自由決定何時執行任務
- 可定義任務的延遲執行時間和執行時間窗口
以下是JobScheduler的示例代碼:
public class JobSchedulerService extends JobService { private static final String TAG = "JobSchedulerService"; @Override public boolean onStartJob(JobParameters params) { // 每10秒執行一次任務 Log.d(TAG, "執行任務"); jobFinished(params, true); return true; } @Override public boolean onStopJob(JobParameters params) { return false; } } public class JobSchedulerActivity extends AppCompatActivity { private static final int JOB_ID = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_job_scheduler); JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, new ComponentName(getPackageName(), JobSchedulerService.class.getName())); builder.setPeriodic(10000); // 每10秒執行一次任務 builder.setPersisted(true); // 需要持久化(重啟依舊有效) builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); builder.setRequiresCharging(false); jobScheduler.schedule(builder.build()); } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/158528.html