做了个应用,总结下对于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都是在主线程里实现的。
分享到:
相关推荐
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应用开发者和系统开发者需要重点掌握的。 全书共10章,第1章介绍了阅读本书所需要做的准备工作,主要包括对android系统架构和源码阅读方法的介绍;...
android的设计与实现:卷i》是android应用开发工程师和android系统工程师进阶修炼的必读之作。它由资深android内核专家亲自执笔,从源代码角度,系统、深入、透彻剖析android系统框架层(framework)的设计思想和...
Android Android Android Android 应用现状 � 设备商: lenovo 、琦基、戴尔、三星、摩托罗拉、华为、英特尔、 Kogan 、索爱、华硕、多普达、爱可 视 、 Archos 等。 � 制造商: HTC 、 Telstra 等。 � 手机设计...
2.5 剖析Android应用程序的结构 2.6 分析Notepad应用程序 2.6.1 加载和运行Notepad应用程序 2.6.2 分解应用程序 2.7 了解应用程序生命周期 2.8 调试应用程序 2.8.1 启动模拟器 2.8.2 ...
书中还结合数独游戏等实例更加形象生动地讲解了 android开发的基本流程,且每章最后都有一个 “快速阅读指南 ”,更加方便了读者的阅读。. 本书内容完整丰富,具有较强的通用性,读者都能通过本书快速学习 ...
二、实训任务 1、Activity的相关知识 简单理解Activity 代表一个用户所能看到的屏幕,Activity 主要是处理一个应用的整体性工作。Activity是最基本的Android 应用程序组件,应用程序中,一个活动通常就是一个单独的...
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 mvc、简易sqlite orm、ioc模块、封装Android httpcliten… 开发工具在软件开发生命周期中扮演着至关重要的角色,它们旨在简化和加速从概念设计...
本系统采用菜单式,实现用户与数据库的交互,界面简洁友好,操作方便,界面设计十分亲切,功能标题醒目,各种功能的实现简单容易,易于理解,用户只需对订票流程和业务调查了解即可,不需掌握数据库等相关知识,上手...
Android 默认在冷启动应用进程至能够调用 Activity.onCreate() 前会加载应用主题中的背景作为预览,而默认背景是白色,与应用在上部拥有绿色 AppBar 的效果不相匹配。 为了生成适应于不同屏幕大小、系统版本的图片...
《潜水艇大挑战》是抖音上的一款小游戏,以面部识别来驱动潜艇通过障碍物,最近特别火爆,相信很多人都玩过。 一时兴起自己用Android自定义View也撸...代码也是按上面三个层面组织的,游戏界面的布局可以简单理解为三
1.3.3 操作可行性 本系统采用菜单式,实现用户与数据库的交互,界面简洁友好,操作方便,界面设计 十分亲切,功能标题醒目,各种功能的实现简单容易,易于理解,用户只需对订票流程 和业务调查了解即可,不需掌握...
- **快速执行**:由于直接对应于机器指令,汇编程序在执行时无需经过复杂的解释或编译过程,能够快速、高效地被执行。 5. **编写与调试难度**: - **复杂性高**:编写汇编程序需要深入了解计算机体系结构和指令集...
提供集成开发环境(IDE),如Visual Studio、Eclipse、Android Studio和Sublime Text等,这些工具集成了文本编辑器,支持语法高亮、自动补全、代码片段管理和版本控制等功能,有助于开发者高效编写和维护代码。...
Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个...
NativeScript 可以使用 Javascript,CSS, XML 创建真正的 Native 跨平台应用,支持 iOS Android,NativeScript 将您的跨平台代码翻译成目标平台的代码。UI 使用 XML 描述,CSS 样式,在编译时将 UI 转化成本地原生...
内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行...
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....