展会信息港展会大全

Android应用开发 主线程启动 ui(视图绘制)、event(事件处理)和other(数据或网络等处理
来源:互联网   发布日期:2016-01-19 11:28:26   浏览:1971次  

导读:本文通过作者自己做的一个应用,而总结出其对于Android应用的简单理解,与各位网友分享。做了个应用,总结下对于android 应用的简单理解从上图可以简单看出,主线程启动,这里把各种操作称为action,主要分为3部 ...

本文通过作者自己做的一个应用,而总结出其对于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" > <span></span>

<activity

android:label="@string/app_name"

android:name=".home.MainActivity"

android:exported="true" //设置此属性,允许外部应用发Intent跳转到此Activity;普通情况下,不需要次属性也可实现跳转,当次应用涉及到系统权限或签名后,跳转时需要设置被跳转的activity此属性

android:screenOrientation="landscape"

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

TextView tv = new TextView(this);

tv.setTextSize(24);

tv.setText("UI绘制");

tv.setOnFocusChangeListener(new OnFocusChangeListener() {

<pre class="brush:java; toolbar: true; auto-links: false;"> @Override

public void onFocusChange(View v, boolean hasFocus) {//事件处理

if (hasFocus) {

<pre class="brush:java; toolbar: true; auto-links: false;"><span></span>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操作

}<span></span> <span></span>

});

//2.用handler 发送消息

<span></span>

//3.继承AsyncTask类更新ui

}

}).start();</pre>

} else {

//TODO

}

}</pre>

});

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都是在主线程里实现的。

赞助本站

人工智能实验室

相关热词: 主线程启动

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港