Android应用处理过程简单理解

移动开发 Android
本文通过作者自己做的一个应用,而总结出其对于Android应用的简单理解,与各位网友分享。

做了个应用,总结下对于android 应用的简单理解

从上图可以简单看出,主线程启动,这里把各种操作称为action,主要分为3部分:

ui(视图绘制)、event(事件处理)和other(数据或网络等处理)

1.当点击图标启动应用A时,系统有个luncher应用会根据A应用里AndroidManifest.xml中声明的<category android:name="android.intent.category.LAUNCHER" />

找到对应启动的activity:

  1. <application 
  2.         android:icon="@drawable/icon_luncher" 
  3.         android:label="@string/app_name" 
  4.         android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" > <span></span>     
  5.     <activity 
  6.              android:label="@string/app_name" 
  7.             android:name=".home.MainActivity" 
  8.             android:exported="true" //设置此属性,允许外部应用发Intent跳转到此Activity;普通情况下,不需要次属性也可实现跳转,当次应用涉及到系统权限或签名后,跳转时需要设置被跳转的activity此属性 
  9.             android:screenOrientation="landscape" 
  10. ndroid:configChanges="orientation|keyboardHidden" //设置为横屏显示,不让屏幕切换为竖屏 
  11.             android:launchMode="singleInstance">//单例模式,详情可以参考android的4种启动模式 
  12.              <intent-filter> 
  13.                 <action android:name="android.intent.action.MAIN" /> 
  14.                 <category android:name="android.intent.category.LAUNCHER" /> 
  15.             </intent-filter> 
  16.             <intent-filter> 
  17.                 <action android:name="android.other.skip.action"/> 
  18.                 <action android:name="android.intent.action.VIEW" /> 
  19.                 <category android:name="android.intent.category.DEFAULT" /> 
  20.             </intent-filter> 
  21.      </activity> 
  22.  </application><span></span> 

问题:

a.当在应用列表中没有找到刚安装的应用A时,可以查看着这个xml中有无设置这个图标 android:icon="@drawable/app_store"和声明

<category android:name="android.intent.category.LAUNCHER" />

b.如果调试的话,可以用命令行启动这个activity:am start -n 包名/包名.activity名,如:com.aaa.bbb/com.aaa.bbb.MainActivity

2.启动Activity,首先到oncreate方法里,setContentView(R.layout.main)显示布局内容(这里的Activity的启动流程详情了解android生命周期)

这里,整个初始化Activity想来是初步完成了。

接下来,会在做一些控件的操作,这里操作归结到UI绘制里。如:

  1. TextView tv = new TextView(this); 
  2.     tv.setTextSize(24); 
  3.     tv.setText("UI绘制"); 
  4.     tv.setOnFocusChangeListener(new OnFocusChangeListener() { 
  5.     <pre class="brush:java; toolbar: true; auto-links: false;"@Override 
  6.          public void onFocusChange(View v, boolean hasFocus) {//事件处理 
  7.              if (hasFocus) {  
  8.     <pre class="brush:java; toolbar: true; auto-links: false;"><span></span>            new Thread(new Runnable(){//大数据处理 
  9.                     @Override 
  10.                     public void run(){ 
  11.                         //这里不能直接做Ui处理,如tv.setText("线程中处理数据")等操作 
  12.                          //1.线程中更新ui可以用Handler直接post(Runnable)方法刷新 
  13.                             new Handler().post(new Runnable(){ 
  14.                                 @Override 
  15.                                 public void run(){ 
  16.                                     updateUI();  //这个自定义方法中可以做ui操作 
  17.                                 }    <span></span> <span></span>                         
  18.                             });    
  19.                         //2.用handler 发送消息 
  20.                         <span></span>      
  21.                         //3.继承AsyncTask类更新ui     
  22.                     } 
  23.                 }).start();</pre> 
  24.     } else { 
  25.                 //TODO 
  26.              } 
  27.          }</pre> 
  28.     }); 

3.上面代码UI绘制、事件处理和数据处理都简单说明了一番。接下来就来简单理解下这3者关系:

a.初始化界面显示,UI绘制已自动完成

b.当用户操作按键(或触屏)时,对应的事件就会触发:按键(onKeyLisetner、onKeyDown(我用的最多就是这个了O(∩_∩)O~)...)、触摸(onTouchListener...)等

这些事件当中可以直接更新UI,如:tv.invalidate()。具体的一些事件处理,如控制焦点都可在这里实现。

c.tv的invalidate()调用后,会最后调用到TextView里onDraw()方法,这个真正来绘制内容的方法

d.处理大数据或网络数据时,一般另起线程。android中在非主线程里是不能够直接更新ui或做ui操作的。为此,adnroid提供消息机制,用Handler发送消息到

Messager queue,消息队列会

自动通知主线程,主线程可以从中获取消息中的参数,来更新对应的UI组件,如下面一个例子:

声明Handler:

  1. Handler h=new Handler(new Callback() { 
  2.         @Override 
  3.         public boolean handleMessage(Message msg) { 
  4.         Bundle data  = msg.getData(); 
  5.         switch (msg.what) { 
  6.         case 0x0//network err 
  7. Toast.makeText(MainActivity.this,getString(R.string.init_notice), 3000).show(); 
  8. index_layout.setBackgroundResource(Color.TRANSPARENT); 
  9.             img_manager.requestFocus(); 
  10.             break
  11.             case 0x1:   //update 
  12.                 showNoticeDialog(); 
  13.             break
  14.             default
  15.             break
  16.             } 
  17.             return false
  18.         } 
  19.     }); 

在之前的线程当中,

  1. //2.用handler 发送消息 
  2.     h.senh.sendEmptyMessage(0x1); 
  3.     //或者 
  4.     /*Message msg = new Message(); 
  5.      msg.what = 0x0; 
  6.      Bundle data= new Bundle(); 
  7.      data.putString("AAA", "BBB"); 
  8.      msg.setData(data); 
  9.      h.sendMessage(msg); 
  10.     */ 

当要在其他类当中用handler发消息,那就想办法把当前Activity中的h实例传过去。

这样最终更新UI都是在主线程里实现的。

责任编辑:闫佳明 来源: oschina
相关推荐

2009-09-24 17:11:53

Hibernate处理

2010-06-02 18:00:05

Postfix邮件

2010-06-09 18:17:20

Postfix邮件

2009-07-20 17:49:07

JSF请求处理

2011-02-21 13:26:47

Postfix邮件处理

2009-07-15 16:29:41

Swing绘画

2011-04-11 16:42:05

Oracle无法启动

2011-08-04 15:24:53

iPhone开发 交互 MVC

2021-02-01 09:00:34

Ceph octopu集群运维

2009-01-27 17:32:00

虚拟化部署案例

2021-01-06 08:13:08

公有云Docker容器

2018-05-30 09:47:02

2011-07-04 14:38:43

QT Qevent

2021-11-08 08:29:57

Oracle数据库后端开发

2020-11-12 07:32:53

JavaScript

2019-08-19 11:07:41

SQL数据库优化

2011-09-02 14:09:47

OracleDML命令

2009-07-24 10:57:41

ASP.NET ISAIIS6

2011-04-13 14:57:11

ASP.NET请求处理

2009-07-28 11:32:41

光纤链路故障
点赞
收藏

51CTO技术栈公众号