Service、BroadcastReceiver、Activity之間的通訊

    Service、BroadcastReceiver、Activity三者之間能夠實現相互通訊,這裏咱們經過一個例子來看看其中的一種通訊吧。java

   一:功能android

   首先應該知道,在非UI界面上操做UI是會出錯的,也就是說在主線程之外的其餘線程上操做主線程中的UI是違法的,可是咱們能夠作出以下操做,來避免這種狀況的發生。編程

   具體功能:在主界面上,啓動後臺服務Service,後臺處理數據,前臺經過BroadcastReceiver得到數據並更新UI。ide

   二:具體實現this

   (1)建立繼承自Service的類完成相應方法的重寫,以及處理數據的操做。spa

public class MyService extends Service {
    private Timer timer;//聲明計時器
    private TimerTask task;//聲明計時器Task
    private int index = 101;//倒計時起點變量
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        startTimer();//啓動計時器
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onDestroy() {
        stopTimer();//中止計時器
        super.onDestroy();
    }
    public void startTimer() {
        timer = new Timer();//實例化Timer對象
        task = new TimerTask() {//實例化TimerTask
            @Override
            public void run() {
                index--;
                Intent i1 = new Intent();// 不能進行頁面的跳轉,只能實例化成這樣
                i1.setAction("action111");// 設置Intent對象的action屬性,以便於在主界面作匹配
                i1.putExtra("name", index);// 攜帶數據
                sendBroadcast(i1);// 發送廣播
            }
        };
        timer.schedule(task, 1000, 1000);// 啓動計時器
    }
    // 中止計時器
    public void stopTimer() {
        timer.cancel();
    }
}

(2)在Minifest.xml文件中註冊Service線程

<service android:name="MyService"></service>

   (3)主界面中完成Service的啓動,數據的接受,UI的更新xml

public class MainActivity extends Activity implements OnClickListener {
    private Button startBtn, stopBtn;//聲明主界面的按鈕
    private Intent intent;//聲明Intent對象
    private TextView tv;//聲明主界面顯示區
    //建立BroadcastReceiver對象,用來接受Service發過來的消息並處理
    private BroadcastReceiver receiver =new BroadcastReceiver() {
                                                                              
        @Override
        public void onReceive(Context context, Intent intent) {
            int num = intent.getIntExtra("name", 0);//得到後臺傳過來的,鍵值爲name對應的值
            tv.setText(num+"");//更新主界面UI
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    //找到資源
        startBtn = (Button) findViewById(R.id.start);
        stopBtn = (Button) findViewById(R.id.stop);
    //爲按鈕加載監聽
        startBtn.setOnClickListener(this);
        stopBtn.setOnClickListener(this);
    //找到資源
        tv = (TextView) findViewById(R.id.textView1);
        //動態註冊BroadcastReceiver對象,並添加要接收數據的action,匹配成功處理數據,不然不處理
        registerReceiver(receiver, new IntentFilter("action111"));
    //實例化Intent對象
        intent = new Intent(MainActivity.this, MyService.class);
                                                                              
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.start:
            startService(intent);//啓動Service
            break;
        case R.id.stop:
            stopService(intent);//中止Service
            break;
        }
    }
                                                                          
    @Override
    protected void onStop() {
        unregisterReceiver(receiver);//取消動態註冊
        super.onStop();
    }
}

   (4)結果對象

   (5)結果分析:blog

   這裏的程序主要的過程是:在Service中處理數據,而後將數據經過Intent對象,將數據傳給前臺,在前臺經過BroadcastReceiver接收數據並更新UI。從中咱們能夠清晰的看到三者之間的聯繫與聯合使用,在從此的編程中,咱們可能還會用到相似的功能,你們要注意咯。

相關文章
相關標籤/搜索