已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
登录|注册Home for dreamUse the technology to change the way of life 目录视图 摘要视图 订阅学院APP首次下载,可得50C币!欢迎来帮助开源“进步”当讲师?爱学习?投票攒课吧认识Atlassian Datacenter产品深圳小伙伴的福利来啦android中的通信机制总结标签:androidbuttonserviceuinull手机2011-08-12 11:1817342人阅读评论(5)收藏举报分类:Android(53)第一种:使用handler来进行通信handler 大家可以把它想象成主线程(UI线程)的一个子线程,它可以给主线程(UI线程)发送数据从而更新主线程(UI线程)的UI与逻辑,handler 是一个子线程所以它的耗时操作不会阻塞主线程,大家都知道在android的开发中如果代码中某个地方阻塞主线程超过5秒的话系统会提示ANR (系统提示强制关闭)所以在耗时操作上我们可以考虑开启一个子线程避免ANR。 handler会向主线程发送消息 会以队列的形式排列着配合等待主线程更新UI 逻辑 等等。javaview plaincopyprint?1. publicclassHandlerActivityextendsActivityimplementsRunnable2. 3. /*更新时间*/4. publicfinalstaticintUPDATE_TIME=0;5. /*更新时间成功*/6. publicfinalstaticintUPDATE_COMPLETED=1;7. 8. /*记录显示时间超过10秒结束线程*/9. privateintmShowNumber=0;10. 11. /*开始计时按钮*/12. privateButtonmButton=null;13. 14. /*计时显示内容*/15. privateTextViewmTextView=null;16. 17. /*线程*/18. privateThreadmThread=null;19. 20. /*线程关闭的标志*/21. privatebooleanmRunning=false;22. 23. Handlerhandler=newHandler()24. Override25. publicvoidhandleMessage(Messagemsg)26. 27. Bundlebundle=msg.getData();28. /通过key的名称拿到它的值29. Stringnumber=bundle.getString(number);30. /msg.what为handler接收到的消息编号31. switch(msg.what)32. caseUPDATE_TIME:33. mTextView.setText(正在更新时间+number);34. break;35. caseUPDATE_COMPLETED:36. mTextView.setText(更新完毕);37. break;38. 39. super.handleMessage(msg);40. 41. ;42. 43. Override44. protectedvoidonCreate(BundlesavedInstanceState)45. setContentView(R.layout.handler);46. 47. /*拿到button与TextView对象*/48. mButton=(Button)findViewById(R.id.button0);49. mTextView=(TextView)findViewById(R.id.textView0);50. mThread=newThread(this);51. 52. mButton.setOnClickListener(newOnClickListener()53. Override54. publicvoidonClick(Viewarg0)55. /*点击按钮后开始线程开始计时*/56. mRunning=true;57. mThread.start();58. 59. );60. 61. mTextView.setText(点击按钮开始更新时间);62. super.onCreate(savedInstanceState);63. 64. 65. publicvoidShowDialog(Stringstring)66. AlertDialog.Builderbuilder=newAlertDialog.Builder(67. HandlerActivity.this);68. builder.setIcon(R.drawable.icon);69. builder.setTitle(string);70. builder.setPositiveButton(确定,newDialogInterface.OnClickListener()71. publicvoidonClick(DialogInterfacedialog,intwhichButton)72. finish();73. 74. );75. builder.show();76. 77. 78. 79. 80. Override81. publicvoidrun()82. 83. while(mRunning)84. try85. mShowNumber+;86. /*把须要的数据放入bandle中*/87. Bundlebandle=newBundle();88. bandle.putString(number,String.valueOf(mShowNumber);89. 90. /*设置这条信息的编号为更新时间*/91. /*将bandle写入message中*/92. /*最后将这个message发送出去*/93. /*mShowNumber小于10更新时间否则更新完毕*/94. Messagemsg=newMessage();95. if(mShowNumber=10)96. msg.what=UPDATE_TIME;97. else98. mRunning=false;99. msg.what=UPDATE_COMPLETED;100. 101. msg.setData(bandle);102. handler.sendMessage(msg);103. Thread.sleep(1000);104. catch(InterruptedExceptione)105. e.printStackTrace();106. 107. 108. 109. 2.Notifation通知栏信息 Notifation通知栏会在屏幕上方向用户提示信息 但是不会打断用户正在阅读的内容,除非用户手动将 Notifation通知栏拉下。 Notifation的好处就是在于不会影响用户的操作,比如用户正在阅读非常重要的信息这时候帮他直接打开一个activity会非常不合适 因为直接影响到了他当时的操作行为 所以Notifation就出来了。建议大家在开发中遇到可能打断用户使用的情况下都去使用Notifation通知栏。javaview plaincopyprint?1. publicclassNotificationActivityextendsActivity2. NotificationManagermManager=null;3. Notificationnotification=null;4. Override5. protectedvoidonCreate(BundlesavedInstanceState)6. setContentView(R.layout.notification);7. 8. /得到通知消息的管理器对象,负责管理Notification的发送与清除消息等9. mManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);10. /创建Notification对象参数分别代表通知栏中显示的图标显示的标题显示的时间11. notification=newNotification(R.drawable.jay,12. Android专业开发群,System.currentTimeMillis();13. 14. /设置在通知栏中点击后Notification自动消失15. notification.flags=Notification.FLAG_AUTO_CANCEL;16. 17. /设置点击后转跳的新activity18. Intentintent=newIntent(this,MyShowActivity.class);19. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);20. 21. /通过bundle可以带一些数据过去这里将字符串传递了过去22. Bundlebundle=newBundle();23. bundle.putString(name,从Notification转跳过来的);24. intent.putExtras(bundle);25. 26. /设置通知栏中显示的内容27. PendingIntentcontentIntent=PendingIntent.getActivity(this,28. R.string.app_name,intent,PendingIntent.FLAG_UPDATE_CURRENT);29. notification.setLatestEventInfo(this,Android专业开发群,30. QQ群号164257885,contentIntent);31. 32. 33. Buttonbutton0=(Button)findViewById(R.id.button0);34. button0.setOnClickListener(newOnClickListener()35. 36. Override37. publicvoidonClick(Viewarg0)38. /打开这个Notification通知39. mManager.notify(0,notification);40. 41. );42. 43. Buttonbutton1=(Button)findViewById(R.id.button1);44. button1.setOnClickListener(newOnClickListener()45. 46. Override47. publicvoidonClick(Viewarg0)48. /关闭这个Notification通知49. mManager.cancelAll();50. 51. );52. 53. super.onCreate(savedInstanceState);54. 55. 56. 3.广播的发送与接收Android开发中如果须要对两个完全没关系的程序之间进行通信 就可以使用发送广播与接收广播的机制来实现 ,例如程序A发送了一个广播 程序B接受到 做一些事情 这样就达到了相互的通讯。javaview plaincopyprint?1. publicclassBroadcastActivityextendsActivity2. 3. 4. 5. ButtonmButton0=null;6. ButtonmButton1=null;7. 8. Override9. protectedvoidonCreate(BundlesavedInstanceState)10. setContentView(R.layout.broadcast);11. 12. mButton0=(Button)findViewById(R.id.button0);13. mButton0.setOnClickListener(newOnClickListener()14. 15. Override16. publicvoidonClick(Viewarg0)17. Intentintent=newIntent(MyService.SEND_OK_MESSAGE);18. intent.putExtra(name,您发送了OK这条广播哦);19. sendBroadcast(intent);20. 21. );22. 23. mButton1=(Button)findViewById(R.id.button1);24. mButton1.setOnClickListener(newOnClickListener()25. 26. Override27. publicvoidonClick(Viewarg0)28. Intentintent=newIntent(MyService.SEND_CANCLE_MESSAGE);29. intent.putExtra(name,您发送了Cancle这条广播哦);30. sendBroadcast(intent);31. 32. );33. 34. /启动Service35. Intenti=newIntent(this,MyService.class);36. startService(i);37. super.onCreate(savedInstanceState);38. 39. javaview plaincopyprint?1. 接收广播的话我们开启一个service在service中通过BroadcastReceiver来接收广播前提是须要接收的广播须要在onStart()中注册一下在AndroidManifest.xml中可以过滤只接收须要接收的广播、2. 3. viewplain4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 在onStart()中注册了程序中所需要的两个广播16. 17. viewplain18. publicclassMyServiceextendsService19. 20. publicfinalstaticStringSEND_OK_MESSAGE=send.ok.message;21. publicfinalstaticStringSEND_CANCLE_MESSAGE=send.cancle.message;22. 23. privateBroadcastReceivermyBroadCast=newBroadcastReceiver()24. 25. Override26. publicvoidonReceive(Contextcontext,Intentintent)27. Stringaction=intent.getAction();28. if(action.equals(SEND_OK_MESSAGE)29. Toast.makeText(context,接收到了一条广播为+SEND_OK_MESSAGE,Toast.LENGTH_LONG).show();30. elseif(action.equals(SEND_CANCLE_MESSAGE)31. Toast.makeText(context,接收到了一条广播为+SEND_CANCLE_MESSAGE,Toast.LENGTH_LONG).show();32. 33. 34. 35. ;36. 37. Override38. publicvoidonCreate()39. super.onCreate();40. 41. 42. Override43. publicvoidonStart(Intentintent,intstartId)44. /注册这两个广播45. IntentFiltermyFilter=newIntentFilter();46. myFilter.addAction(SEND_OK_MESSAGE);47. myFilter.addAction(SEND_CANCLE_MESSAGE);48. this.registerReceiver(myBroadCast,myFilter);49. super.onStart(intent,startId);50. 51. Override52. publicIBinderonBind(Intentarg0)53. returnnull;54. 55. 56. 57. 58. 这里注意一下service如果没有起来我们是接收不到广播的所以一定要保证接收的时候service是开启的,上例中的service是在打开activity时开启的但是如果用户把手机关掉然后在开机,这样的话service就不是打开状态这样就非常危险了因为这时scrvice就接收不到任何消息了除非用户再次进activity才会帮他打开scrvice所以我们可以在用户开机后就直接将scrvice打开,具体的实现方式如下59. 60. 在AndroidManifest.xml中注册一个开机广播这个广播系统只会在开机发出而且只会发出一次所以我们接收这个广播就可以知道手机是否为开机状态61. 62. viewplain63. 64. 65. 66. 67. 68. 69. 注意加入权限70. 71. viewplain72. 73. 74. 在BroadcastRecevier中接收开机广播然后打开service就可以实现开机启动service。75. 76. viewplain77. publicclassMyBootReceiverextendsBroadcastReceiver78. /*开机广播*/79. staticfinalStringBOOT_COMPLETED=ent.action.BOOT_COMPLETED;80. 81. Override82. publicvoidonReceive(Contextcontext,Intentintent)83. /*如果为开机广播则开启service*/84. if(intent.getAction().equals(BOOT_COMPLETED)85. Intenti=newIntent(context,MyService.class);86. context.startService(i);87. 88. 89. 90. 4.Activity与Activity之间的转跳在软件应用的开发中肯定会有多个Activity 这样它们之间就会存在相互转跳的关系 转跳的实现方式还是使用Intent 然后startActivity ,当然转跳的话是可以带数据过去的。比如从A跳到B 可以把A中的一些数据通过Intent传递给B 。javaview plaincopyprint?1. 读下面这段代码大家会发现intent与bandle传递数值的方式基本一样为什么还要分成两个呢?确实他们两个传递的数值的方式非常类似,他们两个的区别就是Intent属于把零散的数据传递过去而bundle则是把零散的数据先放入bundle然后在传递过去。我举一个例子比如我们现在有3个activityA.B.C须要把A的数据穿给B然后在穿给C,如果使用intent一个一个传递须要在A类中一个一个传递给B然后B类中获取到所有数值然后在一个一个传递给C这样很麻烦但是如果是bundle的话B类中直接将bundler传递给C不用一个一个获得具体的值然后在C类中直接取得解析数值。2. 3. 传递4. viewplain5. /*Activity之间传递值*/6. Buttonbotton3=(Button)findViewById(R.id.button3);7. botton3.setOnClickListener(newOnClickListener()8. 9. Override10. publicvoidonClick(Viewarg0)11. Intentintent=newIntent(mContext,ShowActivity.class);12. /使用intent.putExtra()直接传递13. intent.putExtra(name,雨松MOMO);14. intent.putExtra(age,25);15. intent.putExtra(boy,true);16. 17. /把数值放进bundle然后在把整个bundle通过intent.putExtra()传递18. Bundlebundle=newBundle();19. bundle.putString(b_name,小可爱);20. bundle.putInt(b_age,23);21. bundle.putBoolean(b_boy,false);22. /在这里把整个bundle放进intent中23. intent.putExtras(bundle);24. /开启一个新的activity将intent传递过去25. startActivity(intent);26. 27. );28. 29. 接收30. viewplain31. publicclassShowActivityextendsActivity32. 33. Override34. protectedvoidonCreate(BundlesavedInstanceState)35. setContentView(R.layout.my);36. 37. Intentintent=getIntent();38. 39. Stringname=intent.getStringExtra(name);40. /第二个参数为默认值意思就是如果在intent中拿不到的话41. /就用默认值42. intage=intent.getIntExtra(age,0);43. booleanisboy=intent.getBooleanExtra(boy,false);44. TextViewtextView0=(TextView)findViewById(R.id.text0);45. 46. textView0.setText(姓名+name+年龄+age+男孩?+isboy);47. 48. 49. Bundlebundle=intent.getExtras();50. name=bundle.getString(b_name);51. /第二个参数为默认值意思就是如果在bundle中拿不到的话52. /就用默认值53. age=bundle.getInt(b_age,0);54. isboy=bundle.getBoolean(b_boy,false);55. 56. TextViewtextView1=(TextView)findViewById(R.id.text1);57. 58. textView1.setText(姓名+name+年龄+age+男孩?+isboy);59. 60. super.onCreate(savedInstanceState);61. 62. 63. 顶0踩0我的同类文章Android(53) 创建一个简单的android工程的步骤 Application Fundamentals 搭建android编程环境 Eclipse+jdk+SDK Loader android中的进程与线程 android简介 Activities android实现图片下载到sdcard中的例子,用进度条显示现在进度,同时间图片显示出来 android程序调试 Activity学习 更多主题推荐androidcolor通信猜你在找Android开发SlidingMenu 侧滑菜单Android底层技术:HAL驱动开发Cocos2d-x实战-手把手教你上线项目-迷失航线基于Webrtc的跨平台实时语音通信解决方案Cocos2d-Lua手游开发基础篇查看评论5楼AMU05212014-12-25 16:21发表回复学习中4楼u0126195902014-09-25 09:45发表回复好3楼zhbd19892014-05-08 17:33发表回复oh! my god !!2楼gshengod2014-02-20 09:10发表回复3q1楼jingogfhvk0012013-08-12 23:09发表回复很好的总结,下下来试验试验,先谢谢楼主您还没有登录,请登录或注册* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场个人资料PING_WUo 访问:375189次o 积分:4944o 等级:o 排名:第3002名o 原创:131篇o 转载:125篇o 译文:0篇o 评论:168条About mecreative idea文章搜索窗体顶端窗体底端文章分类 Android(54) C/C+(69) Computer thinking(4) Computer tools(2) Computer network(1) Computer Architecture(0) Computer network(1) DB(2) Design Pattern(17) Data structure(11) Interview thinking(9) Interview questions(7) Java(7) Linux network programing(5) Linux(20) Mood status(6) Net storage(2) NS2(10) Operatiion system(3) Others(24) OpenStack(1) Programer life(2) QNX(2) QT(2) product management(3) Tattle(8)阅读排行 android socket编程实例(66531) java中ArrayList 、LinkList区别(21118) android中的通信机制总结(17339) c+中的虚函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 产程异常的产程停滞护理
- 护理带教老师教学沟通方法
- 护理措施的具体执行
- 管道护理最佳实践案例集
- 营养不良的护理教育与培训
- 临建围墙施工方案
- 2025年宠物托管师助理服务场景布置技巧
- 轻钢房屋采购合同模板(2篇)
- 2026年湖南省中医学院附属一医院医护人员招聘考试备考题库及答案详解
- 2026年中国农业银行(浙江分行)人员招聘笔试备考题库及答案详解
- 第 29 课 智能工具再体验说课稿小学信息技术人教版2024五年级全一册-人教版2024
- 宁德时代shl测试题库以及答案
- 初级注册安全工程师(安全生产法律法规)题库及答案(上海市2025年)
- 肿瘤溶解综合征的临床护理
- 湖北省高速公路改扩建施工路域环境提升指南(试行)2025
- 滴滴人证考试题库及答案
- 尾矿库施工方案安全措施与实施步骤试题及答案
- 2026年中考英语专题复习:常考必背热点话题作文满分范文汇编
- 山东卷2025年高考化学真题
- GB/T 12406-2022表示货币的代码
- 大众集团供应商全生命周期管理策略
评论
0/150
提交评论