新聞中心
做了個應(yīng)用,總結(jié)下對于android 應(yīng)用的簡單理解

從上圖可以簡單看出,主線程啟動,這里把各種操作稱為action,主要分為3部分:
ui(視圖繪制)、event(事件處理)和other(數(shù)據(jù)或網(wǎng)絡(luò)等處理)
1.當(dāng)點擊圖標(biāo)啟動應(yīng)用A時,系統(tǒng)有個luncher應(yīng)用會根據(jù)A應(yīng)用里AndroidManifest.xml中聲明的
找到對應(yīng)啟動的activity:
- android:icon="@drawable/icon_luncher"
- android:label="@string/app_name"
- android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" >
- android:label="@string/app_name"
- android:name=".home.MainActivity"
- android:exported="true" //設(shè)置此屬性,允許外部應(yīng)用發(fā)Intent跳轉(zhuǎn)到此Activity;普通情況下,不需要次屬性也可實現(xiàn)跳轉(zhuǎn),當(dāng)次應(yīng)用涉及到系統(tǒng)權(quán)限或簽名后,跳轉(zhuǎn)時需要設(shè)置被跳轉(zhuǎn)的activity此屬性
- android:screenOrientation="landscape"
- ndroid:configChanges="orientation|keyboardHidden" //設(shè)置為橫屏顯示,不讓屏幕切換為豎屏
- android:launchMode="singleInstance">//單例模式,詳情可以參考android的4種啟動模式
問題:
a.當(dāng)在應(yīng)用列表中沒有找到剛安裝的應(yīng)用A時,可以查看著這個xml中有無設(shè)置這個圖標(biāo) android:icon="@drawable/app_store"和聲明
b.如果調(diào)試的話,可以用命令行啟動這個activity:am start -n 包名/包名.activity名,如:com.aaa.bbb/com.aaa.bbb.MainActivity
2.啟動Activity,首先到oncreate方法里,setContentView(R.layout.main)顯示布局內(nèi)容(這里的Activity的啟動流程詳情了解android生命周期)
這里,整個初始化Activity想來是初步完成了。
接下來,會在做一些控件的操作,這里操作歸結(jié)到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(){//大數(shù)據(jù)處理- @Override
- public void run(){
- //這里不能直接做Ui處理,如tv.setText("線程中處理數(shù)據(jù)")等操作
- //1.線程中更新ui可以用Handler直接post(Runnable)方法刷新
- new Handler().post(new Runnable(){
- @Override
- public void run(){
- updateUI(); //這個自定義方法中可以做ui操作
- }
- });
- //2.用handler 發(fā)送消息
- //3.繼承AsyncTask類更新ui
- }
- }).start();
3.上面代碼UI繪制、事件處理和數(shù)據(jù)處理都簡單說明了一番。接下來就來簡單理解下這3者關(guān)系:
a.初始化界面顯示,UI繪制已自動完成
b.當(dāng)用戶操作按鍵(或觸屏)時,對應(yīng)的事件就會觸發(fā):按鍵(onKeyLisetner、onKeyDown(我用的最多就是這個了O(∩_∩)O~)...)、觸摸(onTouchListener...)等
這些事件當(dāng)中可以直接更新UI,如:tv.invalidate()。具體的一些事件處理,如控制焦點都可在這里實現(xiàn)。
c.tv的invalidate()調(diào)用后,會最后調(diào)用到TextView里onDraw()方法,這個真正來繪制內(nèi)容的方法
d.處理大數(shù)據(jù)或網(wǎng)絡(luò)數(shù)據(jù)時,一般另起線程。android中在非主線程里是不能夠直接更新ui或做ui操作的。為此,adnroid提供消息機制,用Handler發(fā)送消息到
Messager queue,消息隊列會
自動通知主線程,主線程可以從中獲取消息中的參數(shù),來更新對應(yīng)的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;
- }
- });
在之前的線程當(dāng)中,
- //2.用handler 發(fā)送消息
- 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);
- */
當(dāng)要在其他類當(dāng)中用handler發(fā)消息,那就想辦法把當(dāng)前Activity中的h實例傳過去。
這樣最終更新UI都是在主線程里實現(xiàn)的。
當(dāng)前文章:Android應(yīng)用處理過程簡單理解
鏈接地址:http://fisionsoft.com.cn/article/cocpohp.html


咨詢
建站咨詢
