标签:
Service
就是默默运行在后台的组件,可以理解为是没有前台的activity,适合用来运行不需要前台界面的代码
服务可以被手动关闭,不会重启,但是如果被自动关闭,内存充足就会重启
startService启动服务的生命周期
onCreate-onStartCommand-onDestroy
重复的调用startService会导致onStartCommand被重复调用
进程优先级
1. 前台进程:拥有前台activity(onResume方法被调用)
2. 可见进程:拥有可见activity(onPause方法被调用)
3. 服务进程:不到万不得已不会被回收,而且即便被回收,内存充足时也会被重启
4. 后台进程:拥有后台activity(activity的onStop方法被调用了),很容易被回收
5. 空进程:没有运行任何activity,很容易被回收
如何显示启动服务和关闭服务
1 写java类继承Service
2 在清单文件中注册service
3 intent = new Intent(this, MyService.class);
4 startService(intent);
5 stopService(intent);
服务的两种启动方式
服务两种启动方式
startService:服务被启动之后,跟启动它的组件没有一毛钱关系
bindService:跟启动它的组件同生共死
绑定服务和解绑服务的生命周期方法:onCreate->onBind->onUnbind->onDestroy
bindService可以做到startService:
我们想要在在activity中调用服务中的方法,无法通过startService调用,服务对象只能由系统来创建,这个时候我们需要调用服务中的方法就需要通过绑定服务实现
思路:首先在服务中 定义一个方法 定义一个内部类,这个内部类继承Binder,我们在这个内部类中定义一个方法,同时在这个方法中调用我们在服务中想要调用地方法,定义一个接口,在接口里面定义一个方法,内部类中的方法通过实现这个接口去实现这个方法。 在服务的onBind方法中,返回定义的内部类。
在activity中启动绑定服务, bindService(intent, conn, BIND_AUTO_CREATE);启动服务时 conn的类实现的ServiceConnection接口中的方法onServiceConnected(ComponentName name, IBinder service) 参数IBinder service就是我们在服务方法中的onBind方法中返回的内部类对象。通过返回的内部类对象去调用服务中的方法。
比喻:将服务比作成领导,领导有办法方法,我们想要找领导办证,也需要调用领导办法的方法,但是我们不能直接找到领导,只能通过领导的中间人对象,通过他去调用领导的办证方法,从而达到办证的目的。
用代码体现:
public class LeaderService extends Service { @Override public IBinder onBind(Intent intent) { // 返回一个Binder对象,这个对象就是中间人对象 return new ZhouMi(); } class ZhouMi extends Binder implements PublicBusiness{ public void QianXian(){ banZheng(); } } public void banZheng(){ System.out.println("办证"); } }
//注册服务
<service android:name="com.xiaochen.banzheng.LeaderService"></service>
//
public class MainActivity extends Activity { private Intent intent; private MyServiceConn conn; PublicBusiness pb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //服务放进意图对象 intent = new Intent(this, LeaderService.class); conn = new MyServiceConn(); //绑定领导服务 bindService(intent, conn, BIND_AUTO_CREATE); } public void click(View v){ //调用服务的办证方法 pb.QianXian(); } class MyServiceConn implements ServiceConnection{ //连接服务成功,此方法调用 @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub pb = (PublicBusiness) service; } @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } } }
两种启动方法混合使用
我们在听音乐的时候,音乐是一个服务进程 ,startService(intent); 但是我们需要在前台见面activity中调用音乐的方法,比如播放音乐,暂停音乐。这个时候,使用服务进程的时候,我们无法访问到音乐服务中的方法,要想使用音乐服务中的方法,只能使用绑定进程,但是绑定进程,在activity销毁的时候也死了,这个时候就可以使用两种启动方法混合使用
Intent intent = new Intent(this, MusicService.class); //混合调用 //为了把服务所在进程变成服务进程 startService(intent); //为了拿到中间人对象 bindService(intent, new MusicServiceConn(), BIND_AUTO_CREATE);
先start,再bind,销毁时先unbind,在destory
使用服务注册广播接收者
Android四大组件都要在清单文件中注册
使用代码配置广播接收者
可以使用清单文件注册
广播一旦发出,系统就会去所有清单文件中寻找,哪个广播接收者的action和广播的action是匹配的,如果找到了,就把该广播接收者的进程启动起来
可以使用代码注册
需要使用广播接收者时,执行注册的代码,不需要时,执行解除注册的代码,有些广播不需要一直去一直接受的
特殊的广播接收者
安卓中有一些广播接收者,必须使用代码注册,清单文件注册是无效的
1. 屏幕锁屏和解锁
2. 电量改变
广播接收者比较特殊,既可以在清单文件中注册,也可以直接使用代码注册
有的广播接收者,必须代码注册
电量改变
屏幕锁屏和解锁
代码体现,通过服务来注册广播接收者
标签:
原文地址:http://www.cnblogs.com/jiaowoxiaochen/p/4951746.html