感觉Service有些纠结,不知道是不是因为书本的原因,书上的例子一个都没成功,看的也是晕头转向的。
一同提到了4个东西,前面嘛自然是那些巴拉巴拉的介绍,直接正题。
重点:
1.创建一个服务(Service);
Android中Service是一个很重要的元素之一,一个 “服务”涉及到Service类的继承,以及在AndroidManifest.xml中添加相关权限许可代码
再者就是 Service类的基础方法,onCreate(), onBind(), onStart(), onStartCommand(), onDestory()......
定义服务的名称很重要,因为这可以让你的服务在其他应用程序中被使用(创建,启动,停止,销毁).对于onStart() 和 onCommand() 方法在功能上是一致的,
只是前者( onStart() )在API L5以上就已经废除了, 取而代之的就是onStartCommand(), 一般后者( onStartCommand() )的默认实现是调用onStart(),并且返回某个值以便于与旧版本兼容。
声明周期:i> Context.StartService() 启动一个服务, onCreate() -> onStart() 或者 onCommand() -> Context.stopService() 或者 stopSelf() -> onDestory() .
ii> Context.bindService() 绑定一个服务, onCreate() -> onBind() -> Context.unbindService() 或者 onUnBind() -> stioSelf() -> onDestory().
看起来又长有复杂,当你自己去用的时候会清晰很多。
实例:
1 package com.qimu.service; 2 3 import android.app.Service; 4 import android.content.BroadcastReceiver; 5 import android.content.Context; 6 import android.content.Intent; 7 import android.content.IntentFilter; 8 import android.os.IBinder; 9 import android.os.SystemClock; 10 import android.util.Log; 11 12 public class QiMuService extends Service { 13 14 qimuReceiver recevier; 15 16 @Override 17 public IBinder onBind(Intent intent) { 18 19 return null; 20 } 21 22 private static final String DEBUG_TAG = "QiMu_DEBUG"; 23 24 public void onCreate() { 25 26 Log.v( DEBUG_TAG, "Service starting" ); 27 28 recevier = new qimuReceiver(); 29 30 super.onCreate(); 31 } 32 33 public void onStart( Intent intent, int startId ) { 34 35 System.out.println( "Start sucess" ); 36 37 IntentFilter filter = new IntentFilter(); 38 filter.addAction("com.qimu.QiMuService"); 39 registerReceiver( recevier, filter ); 40 41 for ( int i = intent.getIntExtra( "_start", 0 ); i < 100; i++ ) { 42 43 SystemClock.sleep( 200 ); 44 if ( i % 5 == 0) { 45 System.out.println( i ); 46 Intent activityCallBack = new Intent(); 47 activityCallBack.setAction( "com.qimu.MainActivity" ); 48 activityCallBack.putExtra( "_time", i ); 49 sendBroadcast( activityCallBack ); 50 } 51 } 52 53 onDestory(); 54 } 55 56 public int onStartCommand( Intent intent, int flags, int startId ) { 57 58 onStart(intent, startId); 59 return Service.START_REDELIVER_INTENT; 60 } 61 62 public void onDestory() { 63 64 super.onDestroy(); 65 } 66 67 public class qimuReceiver extends BroadcastReceiver { 68 69 @Override 70 public void onReceive(Context context, Intent intent) { 71 //...... 72 } 73 74 } 75 76 }
1 package com.qimu.service; 2 3 import android.annotation.SuppressLint; 4 import android.app.Activity; 5 import android.content.BroadcastReceiver; 6 import android.content.Context; 7 import android.content.Intent; 8 import android.content.IntentFilter; 9 import android.os.Bundle; 10 import android.view.View; 11 import android.widget.TextView; 12 13 public class MainActivity extends Activity { 14 15 TextView tv_service; 16 qimuBroadcast broadcast; 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 23 tv_service = ( TextView ) findViewById( R.id.service ); 24 25 tv_service.setOnClickListener(new View.OnClickListener() { 26 27 @Override 28 public void onClick(View arg0) { 29 // TODO Auto-generated method stub 30 //Intent serviceIntent = new Intent( MainActivity.this, com.qimu.service.QiMuService.class ); 31 //serviceIntent.putExtra( "_start", 1 ); 32 //startService( serviceIntent ); 33 Intent intent = new Intent("com.qimu.service.QiMuService"); 34 intent.putExtra("_start", 1 ); 35 startService(intent); 36 } 37 }); 38 } 39 40 public void onStart() { 41 42 System.out.println("Start sucess......"); 43 broadcast = new qimuBroadcast(); 44 IntentFilter intentfilter = new IntentFilter(); 45 intentfilter.addAction("com.qimu.MainActivity"); 46 registerReceiver( broadcast, intentfilter ); 47 super.onStart(); 48 } 49 50 public void onStop() { 51 52 unregisterReceiver( broadcast ); 53 super.onStop(); 54 } 55 56 public class qimuBroadcast extends BroadcastReceiver { 57 58 @SuppressLint("ShowToast") 59 @Override 60 public void onReceive( Context context, Intent intent ) { 61 62 int _time = intent.getIntExtra( "_time", -1 ); 63 tv_service.setText( "" + _time ); 64 } 65 } 66 67 }
书上的例子没成功,所以自己写了一个简单的Service和Activity之间通信的例子,感觉有点挫,不过大体功能是实现了,从Service的注册,创建,启动,调用BroadcastReceiver传递数据,停止,销毁都用了一遍,还是蛮简单的。
2.实现远程结构(AIDL);
当然你费很大功夫写了一个程序,肯定会考虑到跟其他应用程序的“交流”问题(执行其他调用),所以很明显的就会涉及到接口(远程接口)问题,AIDL就是解决这个问题的核心所在了。你要定义远程接口,首先你必须创建一个AIDL文件,在文件中声明接口,然后实现这个接口,并且在onBind()方法被调用时返回这个接口(感觉不太清楚,看代码应该是,创建了一个类来实现这个接口,返回这个类的实例)的实例。
咳咳,自己第一次做的时候连eclipse怎么创建一个AIDL文件都不知道,不过总是有好心人在某个角落留下了例子(链接:http://my.oschina.net/u/779520/blog/79936)。
接着我们就可以通过其接口来实用服务了,这时候就涉及到ServiceConnection的两个方法,onServiceConnected()和onServiceDisconnected()来实现Service的连接和释放连接(注:远程接口调用将进行跨线程的操作,并且同步完成,如果调用需要消耗比较长的时间,那么应该向其他的耗时调用一样在另外的线程中进行处理)。
注:在另外的程序中需要使用这个接口的时候,需要在工程中添加AIDL文件以及相应的包(说的普通点就是涉及到的程序中都要有这个接口文件,一个(主人家)是实现,剩下的(客人)用来调用它)。
实例:
1 package com.qimu.service; 2 3 interface IRemoteInterface { 4 String getValue(); 5 }
1 package com.qimu.service; 2 3 import android.app.Service; 4 import android.content.Intent; 5 import android.os.IBinder; 6 import android.os.RemoteException; 7 8 public class Aidl_Service extends Service { 9 10 public class aidlService extends IRemoteInterface.Stub { 11 12 @Override 13 public String getValue() throws RemoteException { 14 return "Service 连接成功!"; 15 } 16 17 } 18 19 @Override 20 public IBinder onBind(Intent intent) { 21 22 return new aidlService(); 23 } 24 }
1 package com.qimu.service; 2 3 import android.app.Activity; 4 import android.content.ComponentName; 5 import android.content.Context; 6 import android.content.Intent; 7 import android.content.ServiceConnection; 8 import android.os.IBinder; 9 import android.os.RemoteException; 10 import android.view.View; 11 import android.view.View.OnClickListener; 12 import android.widget.Button; 13 import android.widget.TextView; 14 15 public class MainActivity extends Activity implements OnClickListener { 16 17 TextView tv_service; 18 Button bt_1, bt_2; 19 private IRemoteInterface iremoteInterface = null; 20 21 private ServiceConnection serviceconnection = new ServiceConnection() { 22 23 @Override 24 public void onServiceDisconnected(ComponentName arg0) { 25 } 26 27 @Override 28 public void onServiceConnected(ComponentName name, IBinder service) { 29 30 iremoteInterface = IRemoteInterface.Stub.asInterface( service ); 31 bt_2.setEnabled( true ); 32 } 33 }; 34 35 @Override 36 public void onClick( View view ) { 37 // TODO Auto-generated method stub 38 switch ( view.getId() ) { 39 40 case R.id.button1: 41 42 tv_service.setText( "Service starting! " ); 43 bindService( new Intent("com.example.aidlservice.Aidl_Service"), serviceconnection, Context.BIND_AUTO_CREATE ); 44 break; 45 46 case R.id.button2: 47 48 try { 49 tv_service.setText( iremoteInterface.getValue() ); 50 } catch (RemoteException e) { 51 System.out.println("Error"); 52 } 53 break; 54 55 default: 56 break; 57 } 58 } 59 60 }
很简单的一个例子,在客服端程序中有2个Button,1个TextView,点击bt_1绑定并启用服务,点击bt_2获取服务端实现的功能(返回一个字符串)。
3.实现可包装类(Parcelable)
Parcelable类主要是用来封装数据,便于传输,关于它的实用附上链接:http://blog.sina.com.cn/s/blog_78e3ae430100pxba.html,没什么太多好看的,书上提到了也就看了一下。
4.IntentService类
在程序设计中,你会需要处理很多高频率的请求,将这些需要周期性执行的任务放在一个工作队列中,会使得你的程序简单而高效,同时还可以避免创建一个完整的麻烦的Service,IntentService是一个简单的服务,它可以用Intent请求的方法来处理异步的任务,每个Intent都会被添加到与IntentService相关的工作队列中,然后序列化的进行处理,对于返回结果,你可以选择通过广播( sendBroadcast()方法 )向应用程序发送Intent对象,并使用应用程序中的广播接收器(BroadcastReceiver)来捕获这些结果。
实例:1中有使用......嘿嘿......
总结:Android SDK所提供的Service机制真的很强大,一个优秀的Service可以显著的增强应用程序或所提供服务的吸引力, 但是在创建实现一个后台服务的时候要很注意才行,粗糙的设计可能会对实用的移动端的性能和电池的续航能力造成本质上的影响(所以综合测试的时候要特别注意对Service的考虑)。
第二篇,好多天了,到这里也算是结束了,收获很多很多,加油吧骚年。
期末了,要没日没夜的复习了,55555555555555555555555555.