嗯~新年第一篇~~
1、Service与Activity通信(bindService)
编写Service代码:
public class MyService extends Service{
public static final TAG="MyService";
public MyBinder mBinder=new MyBinder();
@Override
public void onCreate(){
super.onCreate();
Log.d(TAG," onCreate() executed");
}
@Override
public int onStartCommand(Intent intent,int flags,int startId){
Log.d(TAG,"onStartCommand() executed");
return super.onStartCommand(intent,flags,startId);
}
@Override
public void onDestroy(){
super.onDestroy();
Log.d(TAG,"onDestroy() executed");
}
@Override
public IBinder onBind(Intent intent){
return mBinder;
}
class MyBinder extend Binder{
public void startDownload(){
//可以开启子线程,执行下载的逻辑
new Thread(new Runnable(){
@Override
public void run(){
//执行具体的下载任务
}).start();
}
}
在主函数中调用:
public class MainActivity extends Activity implements OnClickListener{
private Button startService;
private Button stopService;
private Button bindService;
private Button unbindService;
private MyService.MyBinder mBinder;
private ServiceConnection connection=new ServiceConnection(){
@Override
public void onServiceDisconnected(ComponentName name){
}
@Override
public void onServiceConnected(ComponentName name,IBinder service){
mBinder=(MyService.MyBinder)service;
mBinder.startDownload();//启动下载任务
}
};
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService=findVeiwById(R.id.btn_start);
stopService=findViewById(R.id.btn_stop);
bindService=findViewById(R.id.btn_bind);
unbindService=findViewById(R.id.btn_unbind);
startService.setOnClickListener(this);
stopService.setOnClickListener(this);
bindService.setOnClickListener(this);
unbindService.setOnClickListener(this);
}
@Override
public void onClick(View v){
swich(v.getId()){
case R.id.btn_start:
startService(new Intent(this,MyService.class);
break;
case R.id.btn_stop:
stopService(new Intent(this,MyService.class)):
break;
case R.id.btn_bind:
Intent bindIntent=new Intent(this,MyService.class));
bindService(bindIntent,connection,BIND_AUTO_CREATE);
break;
case R.id.btn_unbind:
unbindService(connection);
break;
}
}
}
理解:
先创建一个ServiceConnection的匿名内部类,重写onServiceConnection()方法,拿到Service中的mBinder对象,实现想怎么指挥Service就怎么指挥Service的功能。
BIND_AUTO_CREATE
销毁服务的方法可以自己琢磨啦。
2、Service与线程的关系
- Service运行在主线程,不能执行耗时的操作;线程可以
- 在Service中可以调用子线程
- 任何Activity都能拿到Service的实例;线程的生命周期与Activity绑定
标准的Service代码:
@Override
public int onStartCommand(Intent intent,int flags,int startId){
new Thread(new Runnable(){
@Override
public void run(){
//执行后台的任务
}
}).start();
return super.onStartCommand(intent,flags,startId){
}
public class MyBinder extends Binder{
//某一方法
public void startDownload(){
new Thread(new Runnable(){
@Override
public void run(){
//执行具体的下载任务
}
}).start();
}
这样逻辑就能通了。
3、开启一个前台服务
为何要开启前台服务:
- 让Service保持一致运行状态,不会因内存不足的原因导致被回收
- 在状态栏可以看到前台服务的运行状态
- 需要类似于通知的效果
思路:只需要在自定义服务生命周期内建立一个通知>>startForeground();
public class MyService extends Service{
public static final TAG="MyService";
private MyBinder mBinder=new MyBinder();
@Override
public void onCreate(){
super.onCreate();
Notification notification=new Notification(R.drawable.ic_lanucher,
"通知",System.currentTimeMillis());
Intent notificationIntent=new Intent(this,MainActivity.class);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,notificationIntent,0);
notification.setLatestEventInfo(this,"通知的标题","通知的内容",pendingIntent);
startForeground(1,notification);
........
}
}
Service的上层调用还是比较简单的。