Android应用长时间运行的解决方案
更新:2023-05-14 00:35
一、使用前台服务
前台服务是指实现了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());
}
}