android中的通信机制总结
第一种:使用handler来进行通信
handler 大家可以把它想象成主线程(UI线程)的一个子线程,它可以给主线程(UI线程)发送数据从而更新主线程(UI线程)的UI与逻辑,handler 是一个子线程所以它的耗时操作不会阻塞主线程,大家都知道在Android的开发中如果代码中某个地方阻塞主线程超过5秒的话系统会提示ANR (系统提示强制关闭)所以在耗时操作上我们可以考虑开启一个子线程避免ANR。 handler会向主线程发送消息 会以队列的形式排列着配合等待主线程更新UI 逻辑 等等。
- public class HandlerActivity extends Activity implements Runnable{
- /**更新时间**/
- public final static int UPDATE_TIME =0;
- /**更新时间成功**/
- public final static int UPDATE_COMPLETED =1;
- /**记录显示时间 超过10秒结束线程**/
- 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();
- //通过key的名称拿到它的值
- String number = bundle.getString("number");
- //msg.what为handler接收到的消息编号
- 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);
- /**拿到button 与 TextView 对象**/
- 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++;
- /** 把须要的数据放入bandle中 **/
- Bundle bandle = new Bundle();
- bandle.putString("number", String.valueOf(mShowNumber));
- /** 设置这条信息的编号为更新时间 **/
- /** 将bandle写入message中 **/
- /** 最后将这个message发送出去 **/
- /** mShowNumber小于10更新时间 否则更新完毕 **/
- 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通知栏。
- public class NotificationActivity extends Activity {
- NotificationManager mManager = null;
- Notification notification =null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- setContentView(R.layout.notification);
- // 得到通知消息的管理器对象,负责管理 Notification 的发送与清除消息等
- mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
- // 创建Notification对象 参数分别代表 通知栏 中显示的图标 显示的标题 显示的时间
- notification = new Notification(R.drawable.jay,
- "Android专业开发群", System.currentTimeMillis());
- // 设置在通知栏中点击后Notification自动消失
- notification.flags = Notification.FLAG_AUTO_CANCEL;
- //设置点击后转跳的新activity
- Intent intent = new Intent(this, MyShowActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_NEW_TASK);
- //通过bundle可以带一些数据过去 这里将字符串传递了过去
- 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) {
- //打开这个Notification通知
- mManager.notify(0, notification);
- }
- });
- Button button1 = (Button)findViewById(R.id.button1);
- button1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- //关闭这个Notification通知
- mManager.cancelAll();
- }
- });
- super.onCreate(savedInstanceState);
- }
- }
3.广播的发送与接收
Android开发中如果须要对两个完全没关系的程序之间进行通信 就可以使用发送广播与接收广播的机制来实现 ,例如程序A发送了一个广播 程序B接受到 做一些事情 这样就达到了相互的通讯。
- 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);
- }
- });
- //启动Service
- Intent i = new Intent(this, MyService.class);
- startService(i);
- super.onCreate(savedInstanceState);
- }
- }
- 接收广播的话 我们开启一个service 在service中通过BroadcastReceiver 来接收广播 前提是须要接收的广播须要在onStart()中注册一下 在AndroidManifest.xml中可以过滤只接收须要接收的广播、
- view plain
- <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()中注册了程序中所需要的两个广播
- view plain
- 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中注册一个开机广播 这个广播系统只会在开机发出而且只会发出一次 所以我们接收这个广播就可以知道手机是否为开机状态
- view plain
- <receiver android:name=".MyBootReceiver" >
- <intent-filter>
- <action android:name="android.intent.action.BOOT_COMPLETED" />
- </intent-filter>
- </receiver>
- 注意加入权限
- view plain
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- 在BroadcastRecevier中接收开机广播 然后打开service 就可以实现开机启动service。
- view plain
- public class MyBootReceiver extends BroadcastReceiver {
- /**开机广播**/
- static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
- @Override
- public void onReceive(Context context, Intent intent) {
- /**如果为开机广播则开启service**/
- if (intent.getAction().equals(BOOT_COMPLETED)) {
- Intent i = new Intent(context, MyService.class);
- context.startService(i);
- }
- }
- }
4.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类中直接取得解析数值。
- 传递
- view plain
- /**Activity之间传递值**/
- 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()直接传递
- intent.putExtra("name", "雨松MOMO");
- intent.putExtra("age", 25);
- intent.putExtra("boy", true);
- //把数值放进bundle 然后在把整个bundle通过intent.putExtra()传递
- Bundle bundle = new Bundle();
- bundle.putString("b_name", "小可爱");
- bundle.putInt("b_age", 23);
- bundle.putBoolean("b_boy", false);
- //在这里把整个bundle 放进intent中
- intent.putExtras(bundle);
- //开启一个新的 activity 将intent传递过去
- startActivity(intent);
- }
- });
- 接收
- view plain
- public class ShowActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- setContentView(R.layout.my);
- Intent intent = getIntent();
- String name = intent.getStringExtra("name");
- //第二个参数为默认值 意思就是如果在intent中拿不到的话
- //就用默认值
- 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");
- //第二个参数为默认值 意思就是如果在bundle中拿不到的话
- //就用默认值
- 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中的通信机制总结的更多相关文章
- Android中AIDL通信机制分析
一.背景 ·1.AIDL出现的原因 在android系统中,每一个程序都是运行在自己的进程中,进程之间无法进行通讯,为了在Android平台,一个进程通常不能访问另一个进程的内存空间,所以要想对话,需 ...
- Android中Alarm的机制
本次给大家分析的是Android中Alarm的机制所用源码为最新的Android4.4.4.首先简单介绍如何使用Alarm并给出其工作原理,接着分析Alarm和Timer以及Handler在完成定时任 ...
- Android中对消息机制(Handler)的再次解读
今天遇到一些关于在子线程中操作Handler的问题,感觉又要研究源代码了,但是关于Handler的话,我之前研究过,可以参考这篇文章:http://blog.csdn.net/jiangwei0910 ...
- .Net中Remoting通信机制简单实例
.Net中Remoting通信机制 前言: 本程序例子实现一个简单的Remoting通信案例 本程序采用语言:c# 编译工具:vs2013工程文件 编译环境:.net 4.0 程序模块: Test测试 ...
- 浅析Android中的消息机制(转)
原博客地址:http://blog.csdn.net/liuhe688/article/details/6407225 在分析Android消息机制之前,我们先来看一段代码: public class ...
- 浅析Android中的消息机制(转)
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
- Android中的Parcel机制 实现Bundle传递对象
Android中的Parcel机制 实现了Bundle传递对象 使用Bundle传递对象,首先要将其序列化,但是,在Android中要使用这种传递对象的方式需要用到Android Parc ...
- 浅析Android中的消息机制-解决:Only the original thread that created a view hierarchy can touch its views.
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
- 浅析Android中的消息机制
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
随机推荐
- C#代码开发规范
Wrod下载 C#代码开发规范 文件状态: [√] 草稿 [ ] 正式 [ ] 修改 文件标识: 当前版本: 1.1 作 者: Empty 联系电话: 最后更新: ...
- CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)环境
一.简介 什么是LAMP LAMP是一种Web网络应用和开发环境,是Linux, Apache, MySQL, Php/Perl的缩写,每一个字母代表了一个组件,每个组件就其本身而言都是在它所代 ...
- bootstrap ace MVC
<<html lang="en"><head> <meta charset="utf-8" /> <title& ...
- Python3基础 使用技巧:把代码的字体变大
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 在包a中编写一个类Father,具有属性:年龄(私有)、姓名(公有); 具有功能:工作(公有)、开车(公有)。 在包a中编写一个子类Son,具有属性:年龄(受保护的)、姓名; 具有功能:玩(私有)、学习(公有)。 最后在包b中编写主类Test,在主类的main方法中测试类Father与类Son。
package a; public class Father { public String name; private int age; public Father(String name) { t ...
- MYSQL主键自动增加的配置及auto_increment注意事项
文章一 原文地址: http://ej38.com/showinfo/mysql-202971.html 文章二: 点击转入第二篇文章 在数据库应用,我们经常要用到唯一编号.在MySQL中可通过字 ...
- windows tomcat 优化
windows tomcat 优化 1. tomcat conf server.xml 在server.xml中修改以一部分,增加节点数目,可以很好的提高性能: <Connector port ...
- CUBRID学习笔记 21 查看主键外键索引
命令 show create table game; game是表名 在web管理中,请在sql标签中查,不要在query中执行. show create table game; === <Re ...
- hdu 栈题1022&1702
http://acm.hdu.edu.cn/showproblem.php?pid=1022 http://blog.csdn.net/swm8023/article/details/6902426此 ...
- x名称空间中的标记拓展
1.x:Type Type类可作为所有数据类型在编程层面上的抽象.在XAML中,如果想表达某个数据类型时就需要使用x:Type标记拓展.例子: 创建一个Button的派生类: using System ...