Android四大组件之服务

来源:互联网 发布:ipad淘宝免费试用在哪 编辑:程序博客网 时间:2024/04/28 09:15
很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用。
为了处理这种后台进程,Android引入了Service的概念。Service在Android中是一种长生命周期的组件,它不实现任何用户界面。

基本概念

Ÿ   Service是一种在后台运行,没有界面的组件,由其他组件调用开始。

Ÿ   创建Service,定义类继承Service,AndroidManifest.xml中定义<service>

Ÿ   开启Service,在其他组件中调用startService方法

Ÿ   停止Service,调用stopService方法

1.在activity中调用service

[html] view plaincopy
  1. /*  
  2.  * 开启服务  
  3.  */  
  4. public void start(View view) {  
  5.     Intent intent = new Intent(this, MyService.class);  
  6.     startService(intent);  
  7. }  
  8. /*  
  9.  * 结束服务  
  10.  */  
  11. public void stop(View view) {  
  12.     Intent intent = new Intent(this, MyService.class);  
  13.     stopService(intent);  
  14. }  

2.定义Service:

[java] view plaincopy
  1. public class MyService extends Service {  
  2.   
  3.     /* 
  4.      * 绑定时调用 
  5.      */  
  6.     public IBinder onBind(Intent intent) {  
  7.         return null;  
  8.     }  
  9.   
  10.     /* 
  11.      * 开启服务时调用 
  12.      */  
  13.     public void onCreate() {  
  14.         super.onCreate();  
  15.         System.out.println("onCreate");  
  16.     }  
  17.   
  18.     /* 
  19.      * 结束服务时调用 
  20.      */  
  21.     public void onDestroy() {  
  22.         super.onDestroy();  
  23.         System.out.println("onDestroy");  
  24.     }  
  25. }  


3.在清单文件中进行定义服务:<service android:name=".PMyService" />

电话录音

电话录音是使用服务来实现的,在后台运行,使用监听器来监听电话的状态,当来电话时,监听器获取到来电话的电话号码,当用户接听后,就开始录音,当监听到电话的状态挂断后,停止录音,并将录音保存到sdcard中。

java代码:

[java] view plaincopy
  1. @Override  
  2. public void onCreate() {  
  3.     //拿到电话服务  
  4.     TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
  5.       
  6.     //电话的状态监听器  
  7.     manager.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);  
  8. }  
  9.   
  10. private final class MyListener extends PhoneStateListener {  
  11.     private String num;  
  12.     private MediaRecorder recorder;   //录音  
  13.     private File file;  
  14.     public void onCallStateChanged(int state, String incomingNumber) {  
  15.         switch (state) {  
  16.             //响铃状态  
  17.             case TelephonyManager.CALL_STATE_RINGING:  
  18.                 //保存电话号  
  19.                 num = incomingNumber;  
  20.                 break;  
  21.             //接通电话状态  
  22.             case TelephonyManager.CALL_STATE_OFFHOOK:  
  23.                 try {  
  24.                     //设置文件保存位置  
  25.                     file = new File(Environment.getExternalStorageDirectory(), num + "_" + System.currentTimeMillis() + ".3gp");  
  26.                       
  27.                     //创建录音器  
  28.                     recorder = new MediaRecorder();  
  29.                       
  30.                     //设置音频的来源(麦克风)  
  31.                     recorder.setAudioSource(AudioSource.MIC);  
  32.                       
  33.                     //采取3gp格式保存  
  34.                     recorder.setOutputFormat(OutputFormat.THREE_GPP);  
  35.                       
  36.                     //设置编码器  
  37.                     recorder.setAudioEncoder(AudioEncoder.AMR_NB);  
  38.                       
  39.                     //输出文件路径  
  40.                     recorder.setOutputFile(file.getAbsolutePath());  
  41.                       
  42.                     //准备  
  43.                     recorder.prepare();  
  44.                       
  45.                     //录音  
  46.                     recorder.start();  
  47.                 } catch (Exception e) {  
  48.                     e.printStackTrace();  
  49.                 }  
  50.                 break;  
  51.                   
  52.             //电话空闲状态  
  53.             case TelephonyManager.CALL_STATE_IDLE:  
  54.                 //电话挂断后停止录音  
  55.                 if (recorder != null) {  
  56.                     recorder.stop();  
  57.                     recorder.release();  
  58.                 }  
  59.                 break;  
  60.         }  
  61.     }  
  62. }  


权限:

[html] view plaincopy
  1.    <!-- 读电话的状态权限 -->  
  2.    <uses-permission android:name="android.permission.READ_PHONE_STATE" />   
  3.    <!-- 录音权限 -->  
  4. <uses-permission android:name="android.permission.RECORD_AUDIO" />   
  5. <!-- sdCard读的权限 -->  
  6. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />   
  7. <!-- sdCard写的权限 -->  
  8. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   
  9. <!-- 打开网络权限 -->  
  10. <uses-permission android:name="android.permission.INTERNET" />   

 

绑定本地服务

绑定本地服务实际上就是activity和服务进行绑定,activity一般是和用户进行交互,而服务一般是进行后台的工作,如果activity中需要访问服务中的一些方法,进行交互,这就需要进行绑定。

Ÿ   使用bindService绑定服务,传入一个自定义的ServiceConnection用来接收IBinder

Ÿ   定义一个业务接口,其中定义需要的使用的方法

Ÿ   服务中自定义一个IBinder继承Binder并实现业务接口,在onBind方法中返回

Ÿ   调用端将IBinder转为接口类型,调用接口中的方法即可调用到服务中的方法

Activity和Service进行绑定示例:

Activity:

[java] view plaincopy
  1. public class MainActivity extends Activity {  
  2.     private QueryService qs;  
  3.     private EditText editText;  
  4.   
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.         editText = (EditText) findViewById(R.id.id);  
  9.           
  10.         // 绑定服务, 传入ServiceConnection用来接收IBinder  
  11.         bindService(new Intent(this, PersonService.class), new MyConn(), BIND_AUTO_CREATE);  
  12.     }  
  13.   
  14.     /* 
  15.      * 自定义的ServiceConnection用来接收IBinder 
  16.      */  
  17.     private final class MyConn implements ServiceConnection {  
  18.         public void onServiceConnected(ComponentName name, IBinder service) {  
  19.             qs = (QueryService) service;  
  20.         }  
  21.         public void onServiceDisconnected(ComponentName name) {  
  22.         }  
  23.     }                                                             
  24.   
  25.     /* 
  26.      * 根据Id获取联系人 
  27.      */  
  28.     public void queryName(View view) {  
  29.         String id = editText.getText().toString();  
  30.         String name = qs.query(Integer.parseInt(id));  
  31.         Toast.makeText(this, name, 0).show();  
  32.     }  
  33. }  

Service:

[java] view plaincopy
  1. public class PersonService extends Service {  
  2.   
  3.     private String[] data = { "zxx""lhm""flx" };  
  4.   
  5.     /* 
  6.      * 当绑定时调用此方法, 返回一个IBinder, 用来调用当前服务中的方法 
  7.      */  
  8.     public IBinder onBind(Intent intent) {  
  9.         return new MyBinder();  
  10.     }  
  11.   
  12.     /* 
  13.      * 查询方法 
  14.      */  
  15.     public String query(int id) {  
  16.         return data[id];  
  17.     }  
  18.   
  19.     /* 
  20.      * 自定义IBinder, 实现QueryService业务接口, 提供给调用者访问当前服务的方法 
  21.      */  
  22.     private final class MyBinder extends Binder implements QueryService {  
  23.         public String query(int id) {  
  24.             return PersonService.this.query(id);  
  25.         }  
  26.     }  
  27.   
  28. }  


 

绑定远程服务

Ÿ   远程绑定服务时无法通过同一个接口来调用方法,这时就需要使用AIDL技术

Ÿ   将接口扩展名改为“.aidl”

Ÿ   去掉权限修饰符

Ÿ   gen文件夹下会生成同名接口

Ÿ   将服务中自定义的IBinder类改为继承接口中的Stub

Ÿ   ServiceConnection中返回的IBinder是代理对象,不能使用强转,改用Stub.asInterface()

0 0
原创粉丝点击