学会了markdown,可以更加优雅的在这里显示代码了。
服务:服务属于计算型组件,提供需要在后台长期运行的服务(复杂计算、音乐播放和下载等),主要特点是无用户界面、在后台运行、生命周期长。
服务的基本用法
服务的基本定义
public class serviceExercise extends Service {
public serviceExercise() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
- onCreate() 会在服务创建的时候调用;
- onStartCommand() 会在每次服务启动时调用;
- onDestrory()会在服务销毁时调用。
- onBind() 活动和服务进行通信
注意:service需要在AndroidManifest.xml中注册才能有效。
启动和停止服务
启动服务
//构建一个Intent对象
Intent startIntent = new Intent(this,serviceExercise.class);
//调用startService()启动服务,这个方法定义在Context类中
startService(startIntent);
停止服务
//构建一个Intent对象
Intent stopIntent = new Intent(this,serviceExercise.class);
//调用stopService()停止服务,这个方法定义在Context类中
stopService(stopIntent);
在serviceExercise中的任何位置调用stopSelf()都可以让服务停下来。
活动与服务进行通信
1. 创建一个Binder对象来对服务的一些功能进行一个管理
private DownloadBinder aBinder= new DownloadBinder();
class DownloadBinder extends Binder {
public void startDownload(){
Log.d("MyService","startDownload executed");
}
public int getProgress(){
Log.d("MyService","get Progress");
return 0;
}
}
//在onBind()中返回创建的Binder对象
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return aBinder;
}
2. 在活动中创建与服务联系的方法
//创建一个Binder的引用
private serviceExercise.DownloadBinder downloadBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//生成Binder实例
downloadBinder = (serviceExercise.DownloadBinder)service;
//调用DownloadBinder中的方法
downloadBinder.startDownload();
downloadBinder.getProgress();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
3. 活动与服务进行绑定
//绑定服务
Intent bindIntent = new Intent(this,serviceExercise.class);
/*
* bindIntent是指创建出的Intent对象
* connection是指创建出的serviceConnection对象
* BIND_AUTO_CREATE是指活动和服务进行绑定之后自动创建服务,即执行服务的onCreate(),不执行onStartCommand()
* */
bindService(bindIntent,connection,BIND_AUTO_CREATE);
//解绑服务
unbindService(connnection);
注意:使用startService()是启动服务开始工作,而bindService()是访问服务中的一些数据或使用其中的一些方法,是为了获取服务于活动的持久连接。
服务的使用技巧
服务是在后台运行的,而且服务的优先级比较低,当出现内存不足的情况下,服务会被回收,若想让服务保持一致运行的状态,可以使用前台服务。
前台服务
public class serviceExercise extends Service {
@Override
public void onCreate() {
super.onCreate();
Intent intent =new Intent(this, MainActivity.class);
PendingIntent pi= PendingIntent.getActivity(this,0,intent,0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargerIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
.setContentIntent(Pi)
.build();
startForeground(1,notification);
}
...
}
使用IntentService
服务中的代码是在主线程中运行的,但一般比较耗时,应使用Android多线程编程技术,在服务每个具体的方法中开启一个子线程。
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
//处理具体的逻辑
stopSelf();
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
为了避免程序员忘记开启县城以及自动停止服务,这里有一种更加方便简单的方式是使用IntentService
1. 新建继承于IntentService的类
//创建一个类继承于IntentService
public class MyIntentService extends IntentService{
//创建一个无参的构造函数
public MyIntentService() {
super("My IntentService");
}
//处理具体逻辑
//在这里打印出所使用的线程ID
@Override
protected void onHandleIntent(Intent intent) {
Log.d("My IntentService","Thread id is"+Thread.currentThread().getId());
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("My IntentService","onDestroy executed");
}
2. 启动服务
启动服务的方式和一般服务相同
Log.d("MainActivity","Thread id is"+Thread.currentThread().getId());
Intent intentService = new Intent(this,MyIntentService.class);
startService(intentService);
注意:
- 打印出来的主线程的ID和执行服务中方法的线程ID不同,因此说明该服务是在子线程中执行的;
- 执行完毕之后执行了onDestroy()服务停止;
- 同样的服务也需要在AndroidManifest.xml中注册。
<service android:name=".MyIntentService"/>
服务就学习到这里,Ending.
网友评论