zoukankan      html  css  js  c++  java
  • intent 和 Broadcast Receiver之间的通信

    工作原理是通过封装一个service启动的一个线程产生的随机数封装到intent对象传递给Activity,Activity接受到后讲结果输出到屏幕。
    
    java的代码:
    
    package jm.out;
    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.view.View.OnClickListener;//引入相关包
    import android.widget.Button;//引入相关包
    import android.widget.TextView;//引入相关包
    //继承自Activity的子类
    public class IntentBroadcastActivity extends Activity {
     public static final int CMD_STOP_SERVICE = 0;
     Button btnStart;//开始服务Button对象应用
     Button btnStop;//停止服务Button对象应用
     TextView tv;//TextView对象应用
     DataReceiver dataReceiver;//BroadcastReceiver对象
     @Override
        public void onCreate(Bundle savedInstanceState) {//重写onCreate方法
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);//设置显示的屏幕
            btnStart = (Button)findViewById(R.id.btnStart);
            btnStop = (Button)findViewById(R.id.btnStop);
            tv = (TextView)findViewById(R.id.tv);
            btnStart.setOnClickListener(new OnClickListener() {//为按钮添加点击事件监听  
       @Override
       public void onClick(View v) {//重写onClick方法
        Intent myIntent = new Intent(IntentBroadcastActivity.this, jm.out.MyService.class);
        IntentBroadcastActivity.this.startService(myIntent);//发送Intent启动Service
       }
      });
            btnStop.setOnClickListener(new OnClickListener() {//为按钮添加点击事件监听 
       @Override
       public void onClick(View v) {//重写onClick方法
        Intent myIntent = new Intent();//创建Intent对象
        myIntent.setAction("wyf.wpf.MyService");
        myIntent.putExtra("cmd", CMD_STOP_SERVICE);
        sendBroadcast(myIntent);//发送广播
       }
      });
        } 
     private class DataReceiver extends BroadcastReceiver{//继承自BroadcastReceiver的子类
      @Override
      public void onReceive(Context context, Intent intent) {//重写onReceive方法
       double data = intent.getDoubleExtra("data", 0);
       tv.setText("Service的数据为:"+data);   
      }  
     }
     @Override
     protected void onStart() {//重写onStart方法
      dataReceiver = new DataReceiver();
      IntentFilter filter = new IntentFilter();//创建IntentFilter对象
      filter.addAction("wyf.wpf.Sample_3_6");
      registerReceiver(dataReceiver, filter);//注册Broadcast Receiver
      super.onStart();
     }
     @Override
     protected void onStop() {//重写onStop方法
      unregisterReceiver(dataReceiver);//取消注册Broadcast Receiver
      super.onStop();
     }
    }
    
    service类:
    
    package jm.out;
    
    import android.app.Service;//引入相关包
    import android.content.BroadcastReceiver;//引入相关包
    import android.content.Context;//引入相关包
    import android.content.Intent;//引入相关包
    import android.content.IntentFilter;//引入相关包
    import android.os.IBinder;//引入相关包
    //继承自Service的子类
    public class MyService extends Service{
     CommandReceiver cmdReceiver;
     boolean flag;
     @Override
     public void onCreate() {//重写onCreate方法
      flag = true;
      cmdReceiver = new CommandReceiver();
      super.onCreate();
     }
     @Override
     public IBinder onBind(Intent intent) {//重写onBind方法
      // TODO Auto-generated method stub
      return null;
     }
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {//重写onStartCommand方法
      IntentFilter filter = new IntentFilter();//创建IntentFilter对象
      filter.addAction("jm.out.MyService");
      registerReceiver(cmdReceiver, filter);//注册Broadcast Receiver
      doJob();//调用方法启动线程
      return super.onStartCommand(intent, flags, startId);
     }
     //方法:
     public void doJob(){
      new Thread(){
       public void run(){
        while(flag){
         try{//睡眠一段时间
          Thread.sleep(1000);
         }
         catch(Exception e){
          e.printStackTrace();
         }
         Intent intent = new Intent();//创建Intent对象
         intent.setAction("jm.out.IntentBroadcastActivity");
         intent.putExtra("data", Math.random());
         sendBroadcast(intent);//发送广播
        }    
       }
       
      }.start();
     } 
     private class CommandReceiver extends BroadcastReceiver{//继承自BroadcastReceiver的子类
      @Override
      public void onReceive(Context context, Intent intent) {//重写onReceive方法
       int cmd = intent.getIntExtra("cmd", -1);//获取Extra信息
       if(cmd == IntentBroadcastActivity.CMD_STOP_SERVICE){//如果发来的消息是停止服务    
        flag = false;//停止线程
        stopSelf();//停止服务
       }
      }  
     }
     @Override
     public void onDestroy() {//重写onDestroy方法
      this.unregisterReceiver(cmdReceiver);//取消注册的CommandReceiver
      super.onDestroy();
     } 
    }
    
    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">
      <Button android:id="@+id/btnStart"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="启动服务" />
      <Button android:id="@+id/btnStop"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="停止服务" />
      <TextView android:id="@+id/tv"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="等待来自Service的数据" />
      </LinearLayout>
    
    androidmanifest.xml的配置:
    
      <?xml version="1.0" encoding="utf-8"?>
    -<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="wyf.wpf" android:versionCode="1" android:versionName="1.0">
    -<application android:icon="@drawable/icon" android:label="@string/app_name">
    -<activity android:name=".Sample_3_6" 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=".MyService" android:process=":remote">
    -<intent-filter>
     <actionandroid:name="wyf.wpf.MyService" />
      </intent-filter>
      </service>
      </application>
      <uses-sdk android:minSdkVersion="7" />
      </manifest>
    要注意的是红色代码,只有这样才可以让service在activity退出后还能运行,保证了主线程停止,service还能在后台运行。 
  • 相关阅读:
    DSYMTools App Bug 分析工具
    Xcode dSYM 文件
    sqlserver数据库18456错误怎么解决?
    C#两个DataTable拷贝问题:该行已经属于另一个表的解决方法
    SNF微信公众号客户端演示-微信开发客户端能干什么
    sqlserver中创建链接服务器图解教程
    C#日期格式转换大全
    C#-MVC开发微信应用(8)--菜单管理的实现
    C#-MVC开发微信应用(7)--在管理系统中同步微信用户分组信息
    C#-MVC开发微信应用(6)--用户分组信息管理
  • 原文地址:https://www.cnblogs.com/endv/p/11695193.html
Copyright © 2011-2022 走看看