Android软件开发之应用程序之间的通信介绍
Android 开发中在程序之间通讯的接口做的还是非常丰富的 本例主要向大家介绍程序之间是如何进行沟通,有哪几种沟通方式 如何来实现沟通。
1.使用handler传递消息
handler 大家可以把它想象成主线程(UI线程)的一个子线程,它可以给主线程(UI线程)发送数据从而更新主线程(UI线程)的UI与逻辑,handler 是一个子线程所以它的耗时操作不会阻塞主线程,大家都知道在android的开发中如果代码中某个地方阻塞主线程超过5秒的话系统会提示ANR (系统提示强制关闭)所以在耗时操作上我们可以考虑开启一个子线程避免ANR。 handler会向主线程发送消息 会以队列的形式排列着配合等待主线程更新UI 逻辑 等等。 下面这个例子诠释了这一点 利用handler传递消息来更新主线程的UI显示内容 点击按钮后每过一秒通过handler发送消息更新UI线程显示的时间 直到显示时间更新到10 然后结束这个线程。
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); } } Android开发中如果须要对两个完全没关系的程序之间进行通信 就可以使用发送广播与接收广播的机制来实现 ,例如程序A发送了一个广播 程序B接受到 做一些事情 这样就达到了相互的通讯。
3.广播的发送与接收
调用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()中注册了程序中所需要的两个广播
在AndroidManifest.xml中注册一个开机广播 这个广播系统只会在开机发出而且只会发出一次 所以我们接收这个广播就可以知道手机是否为开机状态
这里注意一下 service如果没有起来 我们是接收不到广播的 所以一定要保证接收的时候service是开启的,上例中的service是在打开activity时开启的 但是如果用户把手机关掉然后在开机 , 这样的话service就不是打开状态 这样就非常危险了因为这时scrvice就接收不到任何消息了除非用户再次进activity 才会帮他打开scrvice 所以我们可以在用户开机后就直接将scrvice打开,具体的实现方式如下
注意加入权限
在BroadcastRecevier中接收开机广播 然后打开service 就可以实现开机启动service。
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); } });
接收