`
dantily
  • 浏览: 7767 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

android应用处理过程简单理解

 
阅读更多

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


从上图可以简单看出,主线程启动,这里把各种操作称为action,主要分为3部分:
ui(视图绘制)、event(事件处理)和other(数据或网络等处理)

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

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


问题:

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绘制里。如:

        TextView tv = new TextView(this);
	tv.setTextSize(24);
	tv.setText("UI绘制");
	tv.setOnFocusChangeListener(new OnFocusChangeListener() {
		 @Override
	     public void onFocusChange(View v, boolean hasFocus) {//事件处理
	         if (hasFocus) { 
	            new Thread(new Runnable(){//大数据处理
	                @Override
	                public void run(){
	                    //这里不能直接做Ui处理,如tv.setText("线程中处理数据")等操作
	                     //1.线程中更新ui可以用Handler直接post(Runnable)方法刷新
	                        new Handler().post(new Runnable(){
                            @Override
	                            public void run(){
	                                updateUI();  //这个自定义方法中可以做ui操作
	                            }                         
                        });    
	                    //2.用handler 发送消息
	                    //3.继承AsyncTask类更新ui    
	                }
	            }).start();
			 } else {
	            //TODO
	         }
	     }
	});




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:

            Handler h=new Handler(new Callback() {
	    @Override
	    public boolean handleMessage(Message msg) {
	    Bundle data  = msg.getData();
		switch (msg.what) {
	    case 0x0: //network err
	        Toast.makeText(MainActivity.this,getString(R.string.init_notice), 3000).show();
	        index_layout.setBackgroundResource(Color.TRANSPARENT);
	        img_manager.requestFocus();
			break;
	        case 0x1:   //update
            showNoticeDialog();
			break;
	        default:
	        break;
	        }
	        return false;
	    }
	});


在之前的线程当中,

//2.用handler 发送消息
	h.senh.sendEmptyMessage(0x1);
	//或者
	/*Message msg = new Message();
	 msg.what = 0x0;
	 Bundle data= new Bundle();
	 data.putString("AAA", "BBB");
	 msg.setData(data);
	 h.sendMessage(msg);
	*/


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

这样最终更新UI都是在主线程里实现的。
分享到:
评论

相关推荐

    Android高级编程--源代码

    3.1 Android应用程序的组成部分 43 3.2 程序清单简介 44 3.3 使用清单编辑器 47 3.4 Android应用程序生命周期 48 3.5 理解应用程序的优先级和进程状态 49 3.6 分离资源 50 3.6.1 创建资源 50 3.6.2 使用资源...

    深入理解Android:卷I--详细书签版

    针对性强,注重实际应用开发需求,书中所涵盖的知识点都是android应用开发者和系统开发者需要重点掌握的。  全书共10章,第1章介绍了阅读本书所需要做的准备工作,主要包括对android系统架构和源码阅读方法的介绍;...

    Android的设计与实现(卷1)

    android的设计与实现:卷i》是android应用开发工程师和android系统工程师进阶修炼的必读之作。它由资深android内核专家亲自执笔,从源代码角度,系统、深入、透彻剖析android系统框架层(framework)的设计思想和...

    新版Android开发教程.rar

    Android Android Android Android 应用现状 � 设备商: lenovo 、琦基、戴尔、三星、摩托罗拉、华为、英特尔、 Kogan 、索爱、华硕、多普达、爱可 视 、 Archos 等。 � 制造商: HTC 、 Telstra 等。 � 手机设计...

    精通ANDROID 3(中文版)1/2

    2.5 剖析Android应用程序的结构  2.6 分析Notepad应用程序  2.6.1 加载和运行Notepad应用程序  2.6.2 分解应用程序  2.7 了解应用程序生命周期  2.8 调试应用程序  2.8.1 启动模拟器  2.8.2 ...

    Android程序设计基础

    书中还结合数独游戏等实例更加形象生动地讲解了 android开发的基本流程,且每章最后都有一个 “快速阅读指南 ”,更加方便了读者的阅读。.  本书内容完整丰富,具有较强的通用性,读者都能通过本书快速学习 ...

    android开发——简易计算器的设计报告.doc

    二、实训任务 1、Activity的相关知识 简单理解Activity 代表一个用户所能看到的屏幕,Activity 主要是处理一个应用的整体性工作。Activity是最基本的Android 应用程序组件,应用程序中,一个活动通常就是一个单独的...

    精通Android 3 (中文版)2/2

    2.5 剖析Android应用程序的结构  2.6 分析Notepad应用程序  2.6.1 加载和运行Notepad应用程序  2.6.2 分解应用程序  2.7 了解应用程序生命周期  2.8 调试应用程序  2.8.1 启动模拟器  2.8.2 ...

    ThinkAndroid是简易的、遵循Apache2开源协议发布的Android开发框架.zip

    其开发宗旨是简单、快速的进行 Android应用程序的开发,包含Android mvc、简易sqlite orm、ioc模块、封装Android httpcliten… 开发工具在软件开发生命周期中扮演着至关重要的角色,它们旨在简化和加速从概念设计...

    android实训报告.docx

    本系统采用菜单式,实现用户与数据库的交互,界面简洁友好,操作方便,界面设计十分亲切,功能标题醒目,各种功能的实现简单容易,易于理解,用户只需对订票流程和业务调查了解即可,不需掌握数据库等相关知识,上手...

    Android项目源码开源的 Material Design 豆瓣客户端.zip

    Android 默认在冷启动应用进程至能够调用 Activity.onCreate() 前会加载应用主题中的背景作为预览,而默认背景是白色,与应用在上部拥有绿色 AppBar 的效果不相匹配。 为了生成适应于不同屏幕大小、系统版本的图片...

    Android 实现抖音小游戏潜艇大挑战的思路详解

    《潜水艇大挑战》是抖音上的一款小游戏,以面部识别来驱动潜艇通过障碍物,最近特别火爆,相信很多人都玩过。 一时兴起自己用Android自定义View也撸...代码也是按上面三个层面组织的,游戏界面的布局可以简单理解为三

    android实训报告(1).doc

    1.3.3 操作可行性 本系统采用菜单式,实现用户与数据库的交互,界面简洁友好,操作方便,界面设计 十分亲切,功能标题醒目,各种功能的实现简单容易,易于理解,用户只需对订票流程 和业务调查了解即可,不需掌握...

    如何用Android Studio创建一个C语言项目并学习开发C语言和汇编语言.zip

    - **快速执行**:由于直接对应于机器指令,汇编程序在执行时无需经过复杂的解释或编译过程,能够快速、高效地被执行。 5. **编写与调试难度**: - **复杂性高**:编写汇编程序需要深入了解计算机体系结构和指令集...

    eclipse RCP开发一个简单的MYSQL客户端工具.zip

    提供集成开发环境(IDE),如Visual Studio、Eclipse、Android Studio和Sublime Text等,这些工具集成了文本编辑器,支持语法高亮、自动补全、代码片段管理和版本控制等功能,有助于开发者高效编写和维护代码。...

    JAVA上百实例源码以及开源项目源代码

    Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个...

    跨平台移动端开发NativeScript.zip

    NativeScript 可以使用 Javascript,CSS, XML 创建真正的 Native 跨平台应用,支持 iOS Android,NativeScript 将您的跨平台代码翻译成目标平台的代码。UI 使用 XML 描述,CSS 样式,在编译时将 UI 转化成本地原生...

    JAVA上百实例源码以及开源项目

    内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理  这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行...

    java开源包1

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

Global site tag (gtag.js) - Google Analytics