• AndroidのService与Activity的及时通信


    以前发表的博文一直都是没公布到博客园首页,因为怕高手笑话,但是想了想,如果一起讨论一起学习,不耻下问对自己无疑是更好,收获将更多。

    希望各位看官不要喷我。

    先看图片:

    这里有四个按钮,第一个是绑定服务,绑定后,服务里的线程开始运行;第二个是解除绑定,解除绑定貌似只会回调Service的unBind()方法,所以还是要在服务的unBind()或destroy()方法里结束服务线程;第三个就是获取服务里的数据,并同步到Activity的标题;第三就是停止轮询调用获取服务线程的方法,这样就会停止轮询,你讲看到标题的字不会变化了,但是服务里的线程还在继续,因为还没有解除绑定服务。

    这里有一个Activity和一个Service,里面各开一个线程,Activity线程用来刷新标题,Service线程用来改变数据,然后通过绑定服务获取服务的实例,然后就可以调用Service的方法了(笔者yy:要是可以在Activity里调用Service的方法多好啊,拉进了Activity和Service的距离,从此他们不再是交叉线而是螺线线!)

    其中设计的知识还是挺多的,特别是多线程通信的内容,在Acitity里面我们需要用线程来更新界面,少不了要用到Handler和Message,接下来看代码,因为公司人都走了,就剩我还在这写博客,很想回家所以写的比较乱。

    Activity的代码:

      1 package com.bvin.demo.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.Bundle;
      9 import android.os.Handler;
     10 import android.os.IBinder;
     11 import android.os.Message;
     12 import android.view.View;
     13 import android.view.ViewGroup;
     14 import android.widget.Button;
     15 import android.widget.LinearLayout;
     16 
     17 import com.bvin.demo.service.BoundService.LocalBinder;
     18 
     19 public class MainActivity extends Activity {
     20     /** Called when the activity is first created. */
     21     Intent intent;
     22     BoundService service;
     23     boolean isBound;
     24     @Override
     25     public void onCreate(Bundle savedInstanceState) {
     26         super.onCreate(savedInstanceState);
     27         ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
     28      
     29         LinearLayout layout = new LinearLayout(this);
     30         layout.setOrientation(LinearLayout.VERTICAL);
     31         Button btStart = new Button(this);
     32         btStart.setText("开始绑定");
     33         Button btStop = new Button(this);
     34         btStop.setText("解除绑定");
     35         Button btGet = new Button(this);
     36         btGet.setText("获取Service的内容");
     37         Button btEnd = new Button(this);
     38         btEnd.setText("停止获取");
     39         layout.addView(btStart, params);
     40         layout.addView(btStop, params);
     41         layout.addView(btGet, params); 
     42         layout.addView(btEnd, params); 
     43         setContentView(layout);
     44         intent  = new Intent(this,BoundService.class);
     45         btStart.setOnClickListener(new View.OnClickListener() {
     46             
     47             @Override
     48             public void onClick(View v) {
     49                 // TODO Auto-generated method stub
     50                 MainActivity.this.bindService(intent, conn, Context.BIND_AUTO_CREATE);
     51             }
     52         });
     53         btStop.setOnClickListener(new View.OnClickListener() {
     54             
     55             @Override
     56             public void onClick(View v) {
     57                 // TODO Auto-generated method stub
     58                 MainActivity.this.unbindService(conn);
     59             }
     60         });
     61         btGet.setOnClickListener(new View.OnClickListener() {
     62             
     63             @Override
     64             public void onClick(View v) {
     65                 // TODO Auto-generated method stub
     66                 handler.post(runnable);
     67             }
     68         });
     69         btEnd.setOnClickListener(new View.OnClickListener() {
     70             
     71             @Override
     72             public void onClick(View v) {
     73                 // TODO Auto-generated method stub
     74                 handler.removeCallbacks(runnable);
     75             }
     76         });
     77         
     78     }
     79     
     80     private Handler handler = new Handler(){
     81 
     82         @Override
     83         public void handleMessage(Message msg) {
     84             // TODO Auto-generated method stub
     85             super.handleMessage(msg);
     86             setTitle(msg.what+"");
     87         }
     88         
     89     };
     90     
     91     Runnable runnable = new Runnable(){
     92 
     93         @Override
     94         public void run() {
     95             // TODO Auto-generated method stub
     96             Message msg = new Message();
     97             msg.what = MainActivity.this.service.getInt();
     98             handler.sendMessage(msg);
     99             handler.postDelayed(runnable, 2000);
    100         }
    101         
    102     };
    103     
    104     
    105     
    106     @Override
    107     protected void onDestroy() {
    108         // TODO Auto-generated method stub
    109         super.onDestroy();
    110         unbindService(conn);
    111     }
    112 
    113     private ServiceConnection conn = new ServiceConnection(){
    114 
    115         @Override
    116         public void onServiceConnected(ComponentName name, IBinder service) {
    117             // TODO Auto-generated method stub
    118             LocalBinder binder = (LocalBinder)service;
    119             MainActivity.this.service = binder.getService();
    120             
    121             
    122             isBound = true;
    123         }
    124 
    125         @Override
    126         public void onServiceDisconnected(ComponentName name) {//连接断开服务里的线程就会摧毁
    127             // TODO Auto-generated method stub
    128             isBound = false;
    129         }
    130         
    131     };
    132 }

    Service的代码:

      1 package com.bvin.demo.service;
      2 
      3 import android.app.Service;
      4 import android.content.Intent;
      5 import android.os.Binder;
      6 import android.os.Handler;
      7 import android.os.IBinder;
      8 import android.os.Message;
      9 import android.util.Log;
     10 
     11 public class BoundService extends Service{
     12 
     13     private Handler handler  = new Handler(){
     14 
     15         @Override
     16         public void handleMessage(Message msg) {
     17             // TODO Auto-generated method stub
     18             super.handleMessage(msg);
     19         }
     20         
     21     };
     22     
     23     int x = 0;
     24     
     25     private Runnable runable = new Runnable(){
     26 
     27         @Override
     28         public void run() {
     29             // TODO Auto-generated method stub
     30             Log.e("数值", x+"");
     31             x++;
     32             handler.postDelayed(runable, 2000);
     33         }
     34         
     35     };
     36     
     37     public int getInt(){
     38         return x;
     39     }
     40      
     41     private Binder binder = new LocalBinder();
     42     
     43     @Override
     44     public IBinder onBind(Intent intent) {
     45         // TODO Auto-generated method stub
     46         Log.e("BoundService", "onBind");
     47         return binder;
     48     }
     49 
     50     public class LocalBinder extends Binder{
     51         BoundService getService(){
     52             return BoundService.this;
     53         }
     54     }
     55     
     56     @Override
     57     public void onCreate() {//首次创建才调用
     58         // TODO Auto-generated method stub
     59         super.onCreate();
     60         Log.e("BoundService", "onCreate");
     61         handler.post(runable);
     62     }
     63 
     64     @Override
     65     public void onDestroy() {//final摧毁
     66         // TODO Auto-generated method stub
     67         super.onDestroy();
     68         Log.e("BoundService", "onDestroy");
     69         //handler.removeCallbacks(runable);
     70     }
     71 
     72     @Override
     73     public void onStart(Intent intent, int startId) {//开始,可能调用多次
     74         // TODO Auto-generated method stub
     75         super.onStart(intent, startId);
     76         Log.e("BoundService", "onStart");
     77     }
     78 
     79     @Override
     80     public boolean onUnbind(Intent intent) {//接触绑定
     81         // TODO Auto-generated method stub
     82         Log.e("BoundService", "onUnbind");
     83         handler.removeCallbacks(runable);
     84         return super.onUnbind(intent);
     85     }
     86 
     87     @Override
     88     public void onRebind(Intent intent) {//重新绑定
     89         // TODO Auto-generated method stub
     90         super.onRebind(intent);
     91         Log.e("BoundService", "onRebind");
     92     }
     93 
     94     @Override
     95     public int onStartCommand(Intent intent, int flags, int startId) {//服务开始连接
     96         // TODO Auto-generated method stub
     97         Log.e("BoundService", "onStartCommand");
     98         return super.onStartCommand(intent, flags, startId);
     99     }
    100 
    101     
    102     
    103     
    104 }

    记得在Manifest里注册上服务哦!

  • 相关阅读:
    JDOJ 2197: 校门外的树
    简单线段树知识点详解
    求GCD(最大公约数)的两种方式
    USACO Buying Feed, II
    USACO Dueling GPS's
    USACO Milking Cows
    NOIP 2014 比例简化
    USACO Clumsy Cows
    JDOJ 1140: 完数
    NOIP 2008 火柴棒等式
  • 原文地址:https://www.cnblogs.com/bvin/p/2619003.html
Copyright © 2020-2023  润新知