android中的通信机制
16lz
2021-01-26
第一种:使用handler来进行通信
2.Notifation通知栏信息
Notifation通知栏会在屏幕上方向用户提示信息 但是不会打断用户正在阅读的内容,除非用户手动将 Notifation通知栏拉下。 Notifation的好处就是在于不会影响用户的操作,比如用户正在阅读非常重要的信息这时候帮他直接打开一个activity会非常不合适 因为直接影响到了他当时的操作行为 所以Notifation就出来了。建议大家在开发中遇到可能打断用户使用的情况下都去使用Notifation通知栏。
3.广播的发送与接收
Android开发中如果须要对两个完全没关系的程序之间进行通信 就可以使用发送广播与接收广播的机制来实现 ,例如程序A发送了一个广播 程序B接受到 做一些事情 这样就达到了相互的通讯。
4.Activity与Activity之间的转跳
在软件应用的开发中肯定会有多个Activity 这样它们之间就会存在相互转跳的关系 转跳的实现方式还是使用Intent 然后startActivity ,当然转跳的话是可以带数据过去的。比如从A跳到B 可以把A中的一些数据通过Intent传递给B 。
handler 大家可以把它想象成主线程(UI线程)的一个子线程,它可以给主线程(UI线程)发送数据从而更新主线程(UI线程)的UI与逻辑,handler 是一个子线程所以它的耗时操作不会阻塞主线程,大家都知道在android的开发中如果代码中某个地方阻塞主线程超过5秒的话系统会提示ANR (系统提示强制关闭)所以在耗时操作上我们可以考虑开启一个子线程避免ANR。 handler会向主线程发送消息 会以队列的形式排列着配合等待主线程更新UI 逻辑 等等。
publicclassHandlerActivityextendsActivityimplementsRunnable{/**更新时间**/publicfinalstaticintUPDATE_TIME=0;/**更新时间成功**/publicfinalstaticintUPDATE_COMPLETED=1;/**记录显示时间超过10秒结束线程**/privateintmShowNumber=0;/**开始计时按钮**/privateButtonmButton=null;/**计时显示内容**/privateTextViewmTextView=null;/**线程**/privateThreadmThread=null;/**线程关闭的标志**/privatebooleanmRunning=false;Handlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){Bundlebundle=msg.getData();//通过key的名称拿到它的值Stringnumber=bundle.getString("number");//msg.what为handler接收到的消息编号switch(msg.what){caseUPDATE_TIME:mTextView.setText("正在更新时间"+number);break;caseUPDATE_COMPLETED:mTextView.setText("更新完毕");break;}super.handleMessage(msg);}};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){setContentView(R.layout.handler);/**拿到button与TextView对象**/mButton=(Button)findViewById(R.id.button0);mTextView=(TextView)findViewById(R.id.textView0);mThread=newThread(this);mButton.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewarg0){/**点击按钮后开始线程开始计时**/mRunning=true;mThread.start();}});mTextView.setText("点击按钮开始更新时间");super.onCreate(savedInstanceState);}publicvoidShowDialog(Stringstring){AlertDialog.Builderbuilder=newAlertDialog.Builder(HandlerActivity.this);builder.setIcon(R.drawable.icon);builder.setTitle(string);builder.setPositiveButton("确定",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhichButton){finish();}});builder.show();}@Overridepublicvoidrun(){while(mRunning){try{mShowNumber++;/**把须要的数据放入bandle中**/Bundlebandle=newBundle();bandle.putString("number",String.valueOf(mShowNumber));/**设置这条信息的编号为更新时间**//**将bandle写入message中**//**最后将这个message发送出去**//**mShowNumber小于10更新时间否则更新完毕**/Messagemsg=newMessage();if(mShowNumber<=10){msg.what=UPDATE_TIME;}else{mRunning=false;msg.what=UPDATE_COMPLETED;}msg.setData(bandle);handler.sendMessage(msg);Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}}}}
2.Notifation通知栏信息
Notifation通知栏会在屏幕上方向用户提示信息 但是不会打断用户正在阅读的内容,除非用户手动将 Notifation通知栏拉下。 Notifation的好处就是在于不会影响用户的操作,比如用户正在阅读非常重要的信息这时候帮他直接打开一个activity会非常不合适 因为直接影响到了他当时的操作行为 所以Notifation就出来了。建议大家在开发中遇到可能打断用户使用的情况下都去使用Notifation通知栏。
publicclassNotificationActivityextendsActivity{NotificationManagermManager=null;Notificationnotification=null;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){setContentView(R.layout.notification);//得到通知消息的管理器对象,负责管理Notification的发送与清除消息等mManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);//创建Notification对象参数分别代表通知栏中显示的图标显示的标题显示的时间notification=newNotification(R.drawable.jay,"Android专业开发群",System.currentTimeMillis());//设置在通知栏中点击后Notification自动消失notification.flags=Notification.FLAG_AUTO_CANCEL;//设置点击后转跳的新activityIntentintent=newIntent(this,MyShowActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);//通过bundle可以带一些数据过去这里将字符串传递了过去Bundlebundle=newBundle();bundle.putString("name","从Notification转跳过来的");intent.putExtras(bundle);//设置通知栏中显示的内容PendingIntentcontentIntent=PendingIntent.getActivity(this,R.string.app_name,intent,PendingIntent.FLAG_UPDATE_CURRENT);notification.setLatestEventInfo(this,"Android专业开发群","QQ群号164257885",contentIntent);Buttonbutton0=(Button)findViewById(R.id.button0);button0.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewarg0){//打开这个Notification通知mManager.notify(0,notification);}});Buttonbutton1=(Button)findViewById(R.id.button1);button1.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewarg0){//关闭这个Notification通知mManager.cancelAll();}});super.onCreate(savedInstanceState);}}
3.广播的发送与接收
Android开发中如果须要对两个完全没关系的程序之间进行通信 就可以使用发送广播与接收广播的机制来实现 ,例如程序A发送了一个广播 程序B接受到 做一些事情 这样就达到了相互的通讯。
publicclassBroadcastActivityextendsActivity{ButtonmButton0=null;ButtonmButton1=null;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){setContentView(R.layout.broadcast);mButton0=(Button)findViewById(R.id.button0);mButton0.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewarg0){Intentintent=newIntent(MyService.SEND_OK_MESSAGE);intent.putExtra("name","您发送了OK这条广播哦");sendBroadcast(intent);}});mButton1=(Button)findViewById(R.id.button1);mButton1.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewarg0){Intentintent=newIntent(MyService.SEND_CANCLE_MESSAGE);intent.putExtra("name","您发送了Cancle这条广播哦");sendBroadcast(intent);}});//启动ServiceIntenti=newIntent(this,MyService.class);startService(i);super.onCreate(savedInstanceState);}}
接收广播的话 我们开启一个service 在service中通过BroadcastReceiver 来接收广播 前提是须要接收的广播须要在onStart()中注册一下 在AndroidManifest.xml中可以过滤只接收须要接收的广播、view plain<serviceandroid:name=".MyService"><intent-filter><actionandroid:name="cn.m15.xys.MyService"></action></intent-filter><intent-filter><actionandroid:name="send.ok.message"/><actionandroid:name="send.cancle.message"/></intent-filter></service>在onStart()中注册了程序中所需要的两个广播view plainpublicclassMyServiceextendsService{publicfinalstaticStringSEND_OK_MESSAGE="send.ok.message";publicfinalstaticStringSEND_CANCLE_MESSAGE="send.cancle.message";privateBroadcastReceivermyBroadCast=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){Stringaction=intent.getAction();if(action.equals(SEND_OK_MESSAGE)){Toast.makeText(context,"接收到了一条广播为"+SEND_OK_MESSAGE,Toast.LENGTH_LONG).show();}elseif(action.equals(SEND_CANCLE_MESSAGE)){Toast.makeText(context,"接收到了一条广播为"+SEND_CANCLE_MESSAGE,Toast.LENGTH_LONG).show();}}};@OverridepublicvoidonCreate(){super.onCreate();}@OverridepublicvoidonStart(Intentintent,intstartId){//注册这两个广播IntentFiltermyFilter=newIntentFilter();myFilter.addAction(SEND_OK_MESSAGE);myFilter.addAction(SEND_CANCLE_MESSAGE);this.registerReceiver(myBroadCast,myFilter);super.onStart(intent,startId);}@OverridepublicIBinderonBind(Intentarg0){returnnull;}} 这里注意一下 service如果没有起来 我们是接收不到广播的 所以一定要保证接收的时候service是开启的,上例中的service是在打开activity时开启的 但是如果用户把手机关掉然后在开机 , 这样的话service就不是打开状态 这样就非常危险了因为这时scrvice就接收不到任何消息了除非用户再次进activity 才会帮他打开scrvice 所以我们可以在用户开机后就直接将scrvice打开,具体的实现方式如下在AndroidManifest.xml中注册一个开机广播 这个广播系统只会在开机发出而且只会发出一次 所以我们接收这个广播就可以知道手机是否为开机状态view plain<receiverandroid:name=".MyBootReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver>注意加入权限 view plain<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>在BroadcastRecevier中接收开机广播 然后打开service 就可以实现开机启动service。view plainpublicclassMyBootReceiverextendsBroadcastReceiver{/**开机广播**/staticfinalStringBOOT_COMPLETED="android.intent.action.BOOT_COMPLETED";@OverridepublicvoidonReceive(Contextcontext,Intentintent){/**如果为开机广播则开启service**/if(intent.getAction().equals(BOOT_COMPLETED)){Intenti=newIntent(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之间传递值**/Buttonbotton3=(Button)findViewById(R.id.button3);botton3.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewarg0){Intentintent=newIntent(mContext,ShowActivity.class);//使用intent.putExtra()直接传递intent.putExtra("name","雨松MOMO");intent.putExtra("age",25);intent.putExtra("boy",true);//把数值放进bundle然后在把整个bundle通过intent.putExtra()传递Bundlebundle=newBundle();bundle.putString("b_name","小可爱");bundle.putInt("b_age",23);bundle.putBoolean("b_boy",false);//在这里把整个bundle放进intent中intent.putExtras(bundle);//开启一个新的activity将intent传递过去startActivity(intent);}});接收view plainpublicclassShowActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){setContentView(R.layout.my);Intentintent=getIntent();Stringname=intent.getStringExtra("name");//第二个参数为默认值意思就是如果在intent中拿不到的话//就用默认值intage=intent.getIntExtra("age",0);booleanisboy=intent.getBooleanExtra("boy",false);TextViewtextView0=(TextView)findViewById(R.id.text0);textView0.setText("姓名"+name+"年龄"+age+"男孩?"+isboy);Bundlebundle=intent.getExtras();name=bundle.getString("b_name");//第二个参数为默认值意思就是如果在bundle中拿不到的话//就用默认值age=bundle.getInt("b_age",0);isboy=bundle.getBoolean("b_boy",false);TextViewtextView1=(TextView)findViewById(R.id.text1);textView1.setText("姓名"+name+"年龄"+age+"男孩?"+isboy);super.onCreate(savedInstanceState);}}
转自:http://blog.csdn.net/wuchuanpingstone
更多相关文章
- 获取Netflix ESN
- Android(安卓)exception
- android TouchEvent 传递过程
- android Service发送广播
- Android高版本收不到静态注册的广播
- 关于Android中的getApplicationContext的知识
- Android(安卓)Retrofit2网路编程实现方法详解
- Android(安卓)Bundle传递对象
- android Activity 之间传递复杂对象