zoukankan      html  css  js  c++  java
  • Activity、Service、BroadcastReceiver的通信

    目的

    本应用程序包括一个活动(testActivity)和一个服务(testService), 他们各自有自己的广播接收器(MyReceiver 和TestServiceReceiver). 

    当按下Start按钮, testActivity会通过意图(Intent)启动testService. 
    在testService的onStartCommand()创建并启动一个线程(thread),在线程里面重复发送广播(sendBroadcast()),把当前系统时间送给testActivity的MyReceiver. 
    当MyReceiver接收到,会把接收到的时间和新的系统时间比较,并把延迟时间显示出来.

    当按下Stop按钮, testActivity会发送广播送给testService的TestServiceReceiver.  
    当TestServiceReceiver接收到,便会停止服务.

    testActivity.java

    package com.testActivity;
     
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
     
    public class testActivity extends Activity {
     
     final static String MY_ACTION = "testActivity.MY_ACTION" ;
     
     TextView textData;
     
     public static final int RQS_STOP_SERVICE = 1 ;
     MyReceiver myReceiver;
     
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super .onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            textData = (TextView)findViewById(R.id.data);
            Button buttonStart = (Button)findViewById(R.id.start);
            Button buttonStop = (Button)findViewById(R.id.stop);
            buttonStart.setOnClickListener(buttonStartOnClickListener);
            buttonStop.setOnClickListener(buttonStopOnClickListener);
        }
     
        @Override
     protected void onStart() {
      // TODO Auto-generated method stub
         myReceiver = new MyReceiver();
         IntentFilter intentFilter = new IntentFilter();
         intentFilter.addAction(MY_ACTION);
         registerReceiver(myReceiver, intentFilter);   //←Squek:注册receiver等待其他Broadcast传送
      super .onStart();
     }
     
     @Override
     protected void onStop() {
      // TODO Auto-generated method stub
      unregisterReceiver(myReceiver);  //←Squek:取消注册
      super .onStop();
     }
     
     Button.OnClickListener buttonStartOnClickListener
        = new Button.OnClickListener(){
     
      @Override
      public void onClick(View arg0) {
       // TODO Auto-generated method stub
       Intent intent = new Intent(testActivity. this , com.testActivity.testService. class );
       testActivity. this .startService(intent);   //←Squek:Service启动
      }};
     
     Button.OnClickListener buttonStopOnClickListener
     = new Button.OnClickListener(){
     
      @Override
      public void onClick(View arg0) {
       // TODO Auto-generated method stub
       Intent intent = new Intent();
       intent.setAction(testService.MY_ACTION);
       intent.putExtra( "RQS" , RQS_STOP_SERVICE);
       sendBroadcast(intent);  //←Squek:Activity send Broadcast
      }};
     
      //Broadcast Receiver宣告
      private class MyReceiver extends BroadcastReceiver{
     
      @Override
      public void onReceive(Context arg0, Intent arg1) {
       // TODO Auto-generated method stub
       long timestamp = arg1.getLongExtra( "timestamp" , 0 );
       long curtime = System.currentTimeMillis();
       long delay = curtime - timestamp;
       textData.setText(String.valueOf(timestamp)
         + " : " + String.valueOf(curtime)
         + " delay " + String.valueOf(delay)
         + "(ms)" );
      }
     
     }
    }

    testService.java

    package com.testActivity;
     
    import android.app.Service;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.IBinder;
    import android.widget.Toast;
     
    public class testService extends Service {
     
     final static String MY_ACTION = "testService.MY_ACTION" ;
     
     TestServiceReceiver testServiceReceiver;
     boolean running;
     
     @Override
     public void onCreate() {
      // TODO Auto-generated method stub
      Toast.makeText(getBaseContext(),
        "TestServiceReceiver.onCreate" ,
        Toast.LENGTH_LONG).show();
      testServiceReceiver = new TestServiceReceiver();
      super .onCreate();
     }
     
     @Override
     public IBinder onBind(Intent arg0) {
      // TODO Auto-generated method stub
      return null ;
     }
     
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
      // TODO Auto-generated method stub
      Toast.makeText(getBaseContext(),
        "TestServiceReceiver.onStartCommand" ,
        Toast.LENGTH_LONG).show();
      IntentFilter intentFilter = new IntentFilter();
      intentFilter.addAction(MY_ACTION);
      registerReceiver(testServiceReceiver, intentFilter);
      running = true ;
     
      MyThread myThread = new MyThread();
      myThread.start();
     
      return super .onStartCommand(intent, flags, startId);
     }
     
     
     
     @Override
     public void onDestroy() {
      // TODO Auto-generated method stub
      this .unregisterReceiver(testServiceReceiver);
      super .onDestroy();
     }
     
     public class MyThread extends Thread {
     
      @Override
      public void run() {
       // TODO Auto-generated method stub
     
       // TODO Auto-generated method stub
       while (running){
        try {
         Thread.sleep( 1000 );
        } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
        Intent intent = new Intent();
        intent.setAction(testActivity.MY_ACTION);
        intent.putExtra( "timestamp" , System.currentTimeMillis());
        sendBroadcast(intent);  //←Squek:Service send Broadcast
       }
      }
     
     }
     
     public class TestServiceReceiver extends BroadcastReceiver {
     
      @Override
      public void onReceive(Context arg0, Intent arg1) {
       // TODO Auto-generated method stub
       int rqs = arg1.getIntExtra( "RQS" , 0 );
       if (rqs == testActivity.RQS_STOP_SERVICE){
        Toast.makeText(getBaseContext(),
          "TestServiceReceiver.onReceive w/ RQS_STOP_SERVICE" ,
          Toast.LENGTH_LONG).show();
        running = false ;
        stopSelf();
       }
      }
     }
     
    }

    main.xml

    <? xml version = "1.0" encoding = "utf-8" ?>
    < LinearLayout xmlns:android = " http://schemas.android.com/apk/res/android"
        android:orientation = "vertical"
        android:layout_width = "fill_parent"
        android:layout_height = "fill_parent"
        >
    < TextView
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:text = "@string/hello"
        />
    < Button
     android:id = "@+id/start"
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:text = "- Start -"
        />
    < Button
     android:id = "@+id/stop"
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:text = "- Stop -"
        />
    < TextView
     android:id = "@+id/data"
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        />
    </ LinearLayout >

    AndroidManifest.xml setting

    <? xml version = "1.0" encoding = "utf-8" ?>
    < manifest xmlns:android = " http://schemas.android.com/apk/res/android"
          package = "com.testActivity"
          android:versionCode = "1"
          android:versionName = "1.0" >
        < application android:icon = "@drawable/icon" android:label = "@string/app_name" >
            < activity android:name = ".testActivity"
                      android:label = "@string/app_name" >
                < intent-filter >
                    < action android:name = "android.intent.action.MAIN" />
                    < category android:name = "android.intent.category.LAUNCHER" />
                </ intent-filter >
            </ activity >
      < service android:name = ".testService"
         />
        </ application >
        < uses-sdk android:minSdkVersion = "7" />
     
    </ manifest >
  • 相关阅读:
    【刷题】洛谷 P1501 [国家集训队]Tree II
    【刷题】BZOJ 2816 [ZJOI2012]网络
    【刷题】BZOJ 2049 [Sdoi2008]Cave 洞穴勘测
    【刷题】BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊
    【刷题】洛谷 P3690 【模板】Link Cut Tree (动态树)
    【刷题】BZOJ 2190 [SDOI2008]仪仗队
    【刷题】BZOJ 2005 [Noi2010]能量采集
    【刷题】BZOJ 3262 [HNOI2008]GT考试
    (74)Wangdao.com第十三天_Object 对象_属性描述对象
    (73)Wangdao.com第十二天_JavaScript consol 对象与控制台
  • 原文地址:https://www.cnblogs.com/hyb1/p/3046858.html
Copyright © 2011-2022 走看看