距离上篇文章竟然快一年了。这次是想明确service一些比较重要的点。
至于什么是service,我也不想多去讨论,我只想清晰确认这么几个问题:
1、service的生命周期到底如何?
2、Activity如何让service做事?
3、service与thread之间有没有关系?
4、远程service是什么东西?
5、AIDL的使用?
6、前台service?
如果需要图,可以百度,好多。我这里直接运行代码打log。
操作顺序是:
startService(intent),service相应执行的是oncreate() ------> onStartCommand() ------> onStart()。
stopService(intent),service相应执行的是onDestroy()。
startService(intent),service相应执行的是oncreate() ------> onStartCommand() ------> onStart()。
startService(intent),service相应执行的是onStartCommand() ------> onStart()。
stopService(intent),service相应执行的是onDestroy()。
这里可见,onCreate() 只会执行一次,即service第一次被启动的时候,在没有destroy之前,继续启动onCreate()不会再执行。
private ServiceConnection connection = new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			DebugLog("onServiceConnected()");
			
		}
	};public boolean bindService(Intent service, ServiceConnection conn, int flags)
public void unbindService(ServiceConnection conn)
public class MyBinder extends Binder{
		public void startDownload(){
			DebugLog("start download...");
		}
		//获取当前Myservice实例
		public MyService getService(){
			return MyService.this;
		}
	}这个类里面有一个startDownload()方法,模拟下载。public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		DebugLog("onBind()");
		return new MyBinder();
	}MyService.MyBinder myBinder = (MyBinder)service; myBinder.startDownload();
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
		
		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			String string = intent.getStringExtra("main");
			DebugLog("string:"+string);
		}
	};IntentFilter filter = new IntentFilter();
		filter.addAction("com.fleur.mybroadcast");
		registerReceiver(myReceiver, filter);
		DebugLog("registerReceiver success");在service中的onDestroy()函数中反注册:unregisterReceiver(myReceiver);
			case R.id.button8:
				Intent intent5 = new Intent("com.fleur.mybroadcast");
				intent5.putExtra("main", "this broadcast is from mainActivity");
				sendBroadcast(intent5);
				break;public interface OnProgressListener {
	
	public void onProgress(int progress);
}
//更新进度的回调接口
	private OnProgressListener onProgressListener;
	
	/**
	 * 注册回调接口的方法
	 * @param onProgressListener
	 */
	public void setOnProgressListener(OnProgressListener onProgressListener) {
		this.onProgressListener = onProgressListener;
	} 然后再Service里面声明一个方法,依然模拟下载:public void startDownload(){
		new Thread(){
			@Override
			public void run() {
				while(progress < MAX_PROGRESS){
					progress += 5;
					
					//进度发生变化时告诉调用方
					if(onProgressListener!=null){
						onProgressListener.onProgress(progress);
					}
					try {
						sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}.start();
	}public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			DebugLog("onServiceConnected()");
			myBinder = (MyBinder) service;
			myService = myBinder.getService();
			myService.setOnProgressListener(new OnProgressListener() {
				
				@Override
				public void onProgress(int progress) {
					// TODO Auto-generated method stub
					progressBar.setProgress(progress);
				}
			});
		}//然后自己写一个button控制,使用得到的MyService对象调用startDownload()方法,实现回调。
myService.startDownload();
<service android:name="com.fleur.service.MyRemoteService"
            android:process=":remote">
            <intent-filter >
                <action android:name="com.fleur.service.MyRemoteService"/>
            </intent-filter>添加了一句话:android:process=":remote"package com.fleur.service;
interface MyAIDLService{
	String toUpperCase(String str);
}
import com.fleur.service.MyAIDLService.Stub;
Stub mBinder = new Stub() {
		
		@Override
		public String toUpperCase(String str) throws RemoteException {
			// TODO Auto-generated method stub
			if(str!=null){
				return str.toUpperCase();
			}
			return null;
		}
	};其实stub是aidl文件里的,它继承了Binder实现了我们自己写的接口。	private MyAIDLService myAIDLService;
	private ServiceConnection conn = new ServiceConnection(
			) {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			myAIDLService = MyAIDLService.Stub.asInterface(service);
			try {
				String upperStr = myAIDLService.toUpperCase("hello world");
				DebugLog("upperStr = "+upperStr);
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	};这样在去bindService就OK了。实现了不同进程间的通信。Notification notification = new Notification(R.drawable.ic_launcher, "Android_Component", System.currentTimeMillis()); Intent notificationIntent = new Intent(this,MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); notification.setLatestEventInfo(this, "title of notification", "content of notification", pendingIntent); startForeground(1, notification);
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/u014470702/article/details/47617571