码迷,mamicode.com
首页 > 移动开发 > 详细

Android四大组件之service

时间:2015-11-10 01:40:58      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:

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. 电量改变

   广播接收者比较特殊,既可以在清单文件中注册,也可以直接使用代码注册
  有的广播接收者,必须代码注册  
  电量改变
   屏幕锁屏和解锁

代码体现,通过服务来注册广播接收者

 

Android四大组件之service

标签:

原文地址:http://www.cnblogs.com/jiaowoxiaochen/p/4951746.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!