Service和Activity之间的交互

   本地服务的交互
1.通过发送广播的方式进行消息传递
实现原理:
   server端当有内容需要传递时,可以发送一条广播,而client端可以注册一个广播接收者去接收广播信息,
   根据内容做相关的操作。
小结:
   通过广播的方式来实现activity和service的交互是非常简单而且容易实现的,一般可以胜任轻量级的应用。
 它的缺点也比较明显,发送的广播会受到系统的制约,系统会优先发送系统广播,在某些特定的情况之下,
 自定义广播的发送会有延迟,就不能即使的收到信息了,而且在广播接受者中不能做耗时操作,会造成ANR异常。

2.文件的共享
 实现原理:
    server可以把传递的信息写入到文件中,然后client端在读取文件信息,显示在界面上。
 小结:
    通过文件共享的方式达成了activity和service的通信,整体来说也比较简单,相当于一个往里写,一个往外读,
  形成了一个通道,但是也是有缺点,当数据量过多时或者说数据结构过于复杂,那么写入和读取就会造成不一致的
  效果,就会造成错误,而且经过了中转站,也比较消耗时间。

实例:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.   
  3.     private TextView loadingTv;  
  4.     private ProgressBar mBar;  
  5.     private Intent intent;  
  6.     private SharedPreferences pref;  
  7.     Handler handler = new Handler(){  
  8.         public void handleMessage(android.os.Message msg) {  
  9.             int current = pref.getInt("current", -1);  
  10.             if (current>100||current<0) {  
  11.                 Log.i("tag""进度值错误");  
  12.             }else {  
  13.                 mBar.setProgress(current);  
  14.                 loadingTv.setText(current+"%");  
  15.                 handler.sendEmptyMessageDelayed(11000);  
  16.             }  
  17.         }  
  18.     };  
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.         loadingTv = (TextView)findViewById(R.id.loadingTv);  
  24.         mBar = (ProgressBar)findViewById(R.id.bar);  
  25.         intent = new Intent(this,ShareFileService.class);  
  26.         pref = getSharedPreferences("currentLoading", MODE_PRIVATE);  
  27.         mBar.setMax(100);  
  28.     }  
  29.       
  30.     public void start(View view){  
  31.         startService(intent);  
  32.           
  33.         handler.sendEmptyMessageDelayed(11000);  
  34.     }  
  35.       
  36.     public void stop(View view){  
  37.         stopService(intent);  
  38.     }  
  39. }  

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class ShareFileService extends Service{  
  2.   
  3.     private Timer timer;  
  4.     private SharedPreferences preferences;  
  5.     private int i = 0;  
  6.     @Override  
  7.     public void onCreate() {  
  8.         super.onCreate();  
  9.           
  10.         timer = new Timer();   //定时器  
  11.         preferences = getSharedPreferences("currentLoading", MODE_PRIVATE);  
  12.         timer.schedule(new MyTimerTask(), 0,1000);  
  13.     }  
  14.     public void setCurrentLoading(int value){  
  15.         preferences.edit().putInt("current", value).commit();  
  16.     }  
  17.     @Override  
  18.     public IBinder onBind(Intent intent) {  
  19.         return null;  
  20.     }  
  21.       
  22.     @Override  
  23.     public void onDestroy() {  
  24.         super.onDestroy();  
  25.         if (timer!=null) {  
  26.             timer.cancel();  
  27.             timer = null;  
  28.         }  
  29.     }  
  30.     class MyTimerTask extends TimerTask{  
  31.   
  32.         @Override  
  33.         public void run() {  
  34.             setCurrentLoading(i);  
  35.             if (i==100) {  
  36.                 i=0;  
  37.             }  
  38.             i++;  
  39.         }  
  40.           
  41.     }  
  42.   
  43. }  
  44. (注册服务)  

3.自定义接口:
  实现过程:
    自定义接口,在接口当中写入获取数据的方法,在service当中写一个内部类继承与Binder类同时实现这个接口,
    并且重写获取数据的方法,在方法中返回数据,然后在onBind方法中返回自定义类的对象,
    在activity当中绑定服务,写一个类继承于ServiceConnection,通过onServiceConnected方法得到接口自定义的
    子类的对象,然后调用他的方法,就可以得到service端返回的数据了。
  小结:
    这种写法简单,拓展性强,但是也存在缺点,延迟获取服务器端的消息,无法从0开始同步信息,自定义接口方式

    完成通信只能用于进程间通信,不能用于跨进程通信。

实例:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.     private TextView loadTV;  
  3.     private ProgressBar bar;  
  4.     private MyService.MyBind bind;  
  5.     private Loading load;  
  6.     Handler handler = new Handler() {  
  7.         public void handleMessage(android.os.Message msg) {  
  8.             if (msg.what == 1) {  
  9.                 int i = load.getloading();  
  10.                 bar.setProgress(i);  
  11.                 loadTV.setText(i + "%");  
  12.                 handler.sendEmptyMessageDelayed(1100);  
  13.             }  
  14.   
  15.         };  
  16.     };  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_main);  
  22.   
  23.         loadTV = (TextView) findViewById(R.id.loadingTv);  
  24.         bar = (ProgressBar) findViewById(R.id.bar);  
  25.         bar.setMax(100);  
  26.     }  
  27.   
  28.     ServiceConnection conn = new ServiceConnection() {  
  29.   
  30.         @Override  
  31.         public void onServiceDisconnected(ComponentName name) {  
  32.   
  33.         }  
  34.   
  35.         @Override  
  36.         public void onServiceConnected(ComponentName name, IBinder service) {  
  37.             load = (Loading) service;  
  38.         }  
  39.     };  
  40.   
  41.     public void start(View view) {  
  42.         Intent intent = new Intent(this, MyService.class);  
  43.         boolean b = bindService(intent, conn, BIND_AUTO_CREATE);  
  44.         if (b) {  
  45.             Toast.makeText(this"绑定成功", Toast.LENGTH_SHORT).show();  
  46.             handler.sendEmptyMessageDelayed(1100);  
  47.         } else {  
  48.             Toast.makeText(this"绑定失败", Toast.LENGTH_SHORT).show();  
  49.   
  50.         }  
  51.   
  52.     }  
  53.   
  54.     public void stop(View view) {  
  55.         unbindService(conn);  
  56.     }  
  57. }  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class MyService extends Service {  
  2.     private int i = 0;  
  3.     private Timer timer;  
  4.     private MyTimeTask myTimeTask;  
  5.   
  6.     @Override  
  7.     public void onCreate() {  
  8.         super.onCreate();  
  9.         timer = new Timer();  
  10.         myTimeTask = new MyTimeTask();  
  11.         timer.scheduleAtFixedRate(myTimeTask, 0100);  
  12.     }  
  13.   
  14.     @Override  
  15.     public IBinder onBind(Intent intent) {  
  16.         // TODO Auto-generated method stub  
  17.         return new MyBind();  
  18.     }  
  19.   
  20.     class MyBind extends Binder implements Loading {  
  21.         public MyService getservice() {  
  22.             return MyService.this;  
  23.         }  
  24.   
  25.         @Override  
  26.         public int getloading() {  
  27.             // TODO Auto-generated method stub  
  28.             return i;  
  29.         }  
  30.     }  
  31.   
  32.     @Override  
  33.     public void onDestroy() {  
  34.         super.onDestroy();  
  35.         if (timer != null) {  
  36.             timer.cancel();  
  37.             timer = null;  
  38.         }  
  39.     }  
  40.   
  41.     public class MyTimeTask extends TimerTask {  
  42.         @Override  
  43.         public void run() {  
  44.             // TODO Auto-generated method stub  
  45.             if (i < 100) {  
  46.                 i++;  
  47.             } else {  
  48.                 i = 100;  
  49.             }  
  50.         }  
  51.     }  
  52. }  
  53. (注册服务)  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public interface Loading {  
  2.     int getloading();  
  3. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值