Android软件开发之应用程序之间的通信介绍(十八) .

发布时间:2024-11-12 01:11

最新推荐文章于 2024-11-08 13:58:32 发布

hare_Lee 于 2011-10-28 08:54:58 发布

 

Android软件开发之应用程序之间的通信介绍

Android 开发中在程序之间通讯的接口做的还是非常丰富的 本例主要向大家介绍程序之间是如何进行沟通,有哪几种沟通方式 如何来实现沟通。

1.使用handler传递消息

        handler 大家可以把它想象成主线程(UI线程)的一个子线程,它可以给主线程(UI线程)发送数据从而更新主线程(UI线程)的UI与逻辑,handler 是一个子线程所以它的耗时操作不会阻塞主线程,大家都知道在android的开发中如果代码中某个地方阻塞主线程超过5秒的话系统会提示ANR (系统提示强制关闭)所以在耗时操作上我们可以考虑开启一个子线程避免ANR。  handler会向主线程发送消息 会以队列的形式排列着配合等待主线程更新UI 逻辑 等等。

下面这个例子诠释了这一点 利用handler传递消息来更新主线程的UI显示内容 点击按钮后每过一秒通过handler发送消息更新UI线程显示的时间 直到显示时间更新到10 然后结束这个线程。

public class HandlerActivity extends Activity implements Runnable{              public final static int UPDATE_TIME =0;            public final static int UPDATE_COMPLETED =1;                  private int mShowNumber = 0;                  private Button mButton = null;                  private TextView mTextView = null;                 private Thread mThread = null;                 private boolean mRunning = false;            Handler handler = new Handler() {      @Override      public void handleMessage(Message msg) {                    Bundle bundle= msg.getData();                    String  number = bundle.getString("number");                     switch(msg.what) {          case UPDATE_TIME:          mTextView.setText("正在更新时间" + number);          break;          case UPDATE_COMPLETED:          mTextView.setText("更新完毕");          break;          }          super.handleMessage(msg);      }      };        @Override      protected void onCreate(Bundle savedInstanceState) {      setContentView(R.layout.handler);                  mButton = (Button)findViewById(R.id.button0);      mTextView = (TextView)findViewById(R.id.textView0);      mThread = new Thread(this);            mButton.setOnClickListener(new OnClickListener() {          @Override          public void onClick(View arg0) {                    mRunning = true;          mThread.start();          }      });            mTextView.setText("点击按钮开始更新时间");      super.onCreate(savedInstanceState);      }        public void ShowDialog(String string) {      AlertDialog.Builder builder = new AlertDialog.Builder(          HandlerActivity.this);      builder.setIcon(R.drawable.icon);      builder.setTitle(string);      builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {          public void onClick(DialogInterface dialog, int whichButton) {          finish();          }      });      builder.show();      }             @Override      public void run() {        while (mRunning) {          try {          mShowNumber++;                    Bundle bandle = new Bundle();          bandle.putString("number", String.valueOf(mShowNumber));                                                    Message msg = new Message();          if(mShowNumber <=10) {              msg.what = UPDATE_TIME;           }else {              mRunning = false;              msg.what = UPDATE_COMPLETED;            }          msg.setData(bandle);          handler.sendMessage(msg);          Thread.sleep(1000);          } catch (InterruptedException e) {          e.printStackTrace();          }      }      }  }  


2.Notifation通知栏信息
       Notifation通知栏会在屏幕上方向用户提示信息 但是不会打断用户正在阅读的内容,除非用户手动将 Notifation通知栏拉下。 Notifation的好处就是在于不会影响用户的操作,比如用户正在阅读非常重要的信息这时候帮他直接打开一个activity会非常不合适 因为直接影响到了他当时的操作行为 所以Notifation就出来了。建议大家在开发中遇到可能打断用户使用的情况下都去使用Notifation通知栏。

屏幕上方为弹出的Notifation通知栏


将Notifation通知栏拉下后会出现相应的信息

public class NotificationActivity extends Activity {       NotificationManager mManager = null;       Notification notification =null;       @Override       protected void onCreate(Bundle savedInstanceState) {       setContentView(R.layout.notification);                 mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);              notification = new Notification(R.drawable.jay,           "Android专业开发群", System.currentTimeMillis());                     notification.flags = Notification.FLAG_AUTO_CANCEL;                      Intent intent = new Intent(this, MyShowActivity.class);       intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_NEW_TASK);                 Bundle bundle = new Bundle();       bundle.putString("name", "从Notification转跳过来的");       intent.putExtras(bundle);                     PendingIntent contentIntent = PendingIntent.getActivity(this,           R.string.app_name, intent, PendingIntent.FLAG_UPDATE_CURRENT);       notification.setLatestEventInfo(this, "Android专业开发群",           "QQ群号 164257885", contentIntent);                 Button button0 = (Button)findViewById(R.id.button0);       button0.setOnClickListener(new OnClickListener() {                      @Override           public void onClick(View arg0) {                      mManager.notify(0, notification);           }       });              Button button1 = (Button)findViewById(R.id.button1);       button1.setOnClickListener(new OnClickListener() {                      @Override           public void onClick(View arg0) {                      mManager.cancelAll();           }       });              super.onCreate(savedInstanceState);       }      }  


3.广播的发送与接收

Android开发中如果须要对两个完全没关系的程序之间进行通信 就可以使用发送广播与接收广播的机制来实现 ,例如程序A发送了一个广播 程序B接受到 做一些事情 这样就达到了相互的通讯。

调用sendBroadcast() 传入intent  后 来发送广播

public class BroadcastActivity extends Activity {                   Button mButton0 = null;       Button mButton1 = null;          @Override       protected void onCreate(Bundle savedInstanceState) {       setContentView(R.layout.broadcast);              mButton0 = (Button)findViewById(R.id.button0);       mButton0.setOnClickListener(new OnClickListener() {                      @Override           public void onClick(View arg0) {                   Intent intent = new Intent(MyService.SEND_OK_MESSAGE);                   intent.putExtra("name", "您发送了OK这条广播哦");                   sendBroadcast(intent);           }       });          mButton1 = (Button)findViewById(R.id.button1);       mButton1.setOnClickListener(new OnClickListener() {                      @Override           public void onClick(View arg0) {                   Intent intent = new Intent(MyService.SEND_CANCLE_MESSAGE);                   intent.putExtra("name", "您发送了Cancle这条广播哦");                   sendBroadcast(intent);           }       });                     Intent i = new Intent(this, MyService.class);       startService(i);       super.onCreate(savedInstanceState);       }   }  

接收广播的话 我们开启一个service 在service中通过BroadcastReceiver 来接收广播 前提是须要接收的广播须要在onStart()中注册一下 在AndroidManifest.xml中可以过滤只接收须要接收的广播、

<service android:name=".MyService">       <intent-filter>           <action android:name="cn.m15.xys.MyService"></action>       </intent-filter>       <intent-filter>           <action android:name="send.ok.message" />           <action android:name="send.cancle.message" />       </intent-filter>   </service>  



在onStart()中注册了程序中所需要的两个广播

public class MyService extends Service {          public final static String SEND_OK_MESSAGE = "send.ok.message";       public final static String SEND_CANCLE_MESSAGE = "send.cancle.message";              private BroadcastReceiver myBroadCast = new BroadcastReceiver() {          @Override       public void onReceive(Context context, Intent intent) {           String action = intent.getAction();           if (action.equals(SEND_OK_MESSAGE)) {           Toast.makeText(context, "接收到了一条广播为" + SEND_OK_MESSAGE, Toast.LENGTH_LONG).show();           }else if(action.equals(SEND_CANCLE_MESSAGE)) {           Toast.makeText(context, "接收到了一条广播为" + SEND_CANCLE_MESSAGE, Toast.LENGTH_LONG).show();           }       }          };          @Override       public void onCreate() {       super.onCreate();       }          @Override       public void onStart(Intent intent, int startId) {              IntentFilter myFilter = new IntentFilter();       myFilter.addAction(SEND_OK_MESSAGE);       myFilter.addAction(SEND_CANCLE_MESSAGE);       this.registerReceiver(myBroadCast, myFilter);           super.onStart(intent, startId);       }       @Override       public IBinder onBind(Intent arg0) {       return null;       }      }  


        这里注意一下 service如果没有起来 我们是接收不到广播的 所以一定要保证接收的时候service是开启的,上例中的service是在打开activity时开启的 但是如果用户把手机关掉然后在开机 , 这样的话service就不是打开状态 这样就非常危险了因为这时scrvice就接收不到任何消息了除非用户再次进activity 才会帮他打开scrvice 所以我们可以在用户开机后就直接将scrvice打开,具体的实现方式如下

在AndroidManifest.xml中注册一个开机广播  这个广播系统只会在开机发出而且只会发出一次 所以我们接收这个广播就可以知道手机是否为开机状态

<receiver android:name=".MyBootReceiver" >         <intent-filter>            <action android:name="android.intent.action.BOOT_COMPLETED" />        </intent-filter>      </receiver>  


注意加入权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />  


在BroadcastRecevier中接收开机广播  然后打开service 就可以实现开机启动service。

public class MyBootReceiver extends BroadcastReceiver {             static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";          @Override       public void onReceive(Context context, Intent intent) {              if (intent.getAction().equals(BOOT_COMPLETED)) {           Intent i = new Intent(context, MyService.class);           context.startService(i);       }          }   }  

3.Activity与Activity之间的转跳

在软件应用的开发中肯定会有多个Activity     这样它们之间就会存在相互转跳的关系      转跳的实现方式还是使用Intent  然后startActivity  ,当然转跳的话是可以带数据过去的。比如从A跳到B 可以把A中的一些数据通过Intent传递给B 。

       读下面这段代码 大家会发现intent与bandle 传递数值的方式基本一样为什么还要分成两个呢? 确实他们两个传递的数值的方式非常类似, 他们两个的区别就是Intent属于把零散的数据传递过去 而bundle则是把零散的数据先放入bundle 然后在传递过去。我举一个例子 比如我们现在有3个activity  A.B.C  须要把A的数据穿给B然后在穿给C ,如果使用intent一个一个传递 须要在A类中一个一个传递给B 然后B类中获取到所有数值  然后在一个一个传递给C  这样很麻烦 但是 如果是bundle的话 B类中直接将bundler传递给C 不用一个一个获得具体的值  然后在C类中直接取得解析数值。

传递

                 Button botton3 = (Button)findViewById(R.id.button3);          botton3.setOnClickListener(new OnClickListener() {              @Override       public void onClick(View arg0) {        Intent intent = new Intent(mContext,ShowActivity.class);                 intent.putExtra("name", "雨松MOMO");        intent.putExtra("age", 25);        intent.putExtra("boy", true);                       Bundle bundle = new Bundle();        bundle.putString("b_name", "小可爱");        bundle.putInt("b_age", 23);        bundle.putBoolean("b_boy", false);                intent.putExtras(bundle);                 startActivity(intent);       }   });     


接收

public class ShowActivity extends Activity {              @Override       protected void onCreate(Bundle savedInstanceState) {       setContentView(R.layout.my);              Intent intent = getIntent();              String name = intent.getStringExtra("name");                      int age  = intent.getIntExtra("age", 0);       boolean isboy = intent.getBooleanExtra("boy", false);       TextView textView0 = (TextView)findViewById(R.id.text0);              textView0.setText("姓名  " + name + "年龄 " + age + "男孩?  " + isboy);                     Bundle bundle = intent.getExtras();       name = bundle.getString("b_name");                     age = bundle.getInt("b_age",0);       isboy = bundle.getBoolean("b_boy", false);              TextView textView1 = (TextView)findViewById(R.id.text1);              textView1.setText("姓名  " + name + "年龄 " + age + "男孩?  " + isboy);              super.onCreate(savedInstanceState);       }      }  

网址:Android软件开发之应用程序之间的通信介绍(十八) . https://www.yuejiaxmz.com/news/view/42338

相关内容

软件开发实验室简介
12 个最佳时间管理应用程序、工具和软件(2024 年)
软件工程: 软件开发过程选择
软技能2软件开发者职业生涯指南
统一软件开发过程(RUP)分析
美容美发软件哪个好 十款常用美容美发软件推荐
移动app软件开发50个创意
微软家庭安全应用microsoft family safety app
华为软件开发工程师
基于Android平台个人理财系统设计与实现(程序+开题报告)(开题报告+源码)

随便看看