在Android的聯機文檔中,有對Activity的簡單介紹,現在通過編寫代碼對Activity的啟動模式做一個深入的理解。
在配置文件AndroidManifest.xml中,activity元素的android:launchMode屬性用來配置對應Activity的啟動模式,目前有以下四種啟動模式:
1.standard
2.singleTop
3.singleTask
4.singleInstance
如果不對Activity設置啟動模式,默認就是standard模式
一、standard
請看以下代碼,實現了一個Activity :
public class A_Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView=new TextView(this);
textView.setText(this+"");//這里用于打印當前Activity的hashcode,可以此判斷Activity實例是不是同一個對象
Button button=new Button(this);
button.setText("Go next activity");
button.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent();
intent.setClass(A_Activity.this, A_Activity.class);//說明發出Intent與啟動的Activity都是A_Activity的實例
startActivity(intent);
}
});
LinearLayout layout=new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(textView);
layout.addView(button);
setContentView(layout);
}
}
運行之,請看下圖:
點擊button后,注意看第一行的textView
由此可知,生成了新的A_Activity對象,這時我們按回退鍵,就會依次回到之前的Activity。點擊button的過程就是壓棧的過程,在standard模式下,就會不斷生成新的Activity對象
二、singleTop
singleTop和standard模式都會將intent發送給新的Activity實例,不同的是,如果創建Intent的時候棧頂有要創建的singleTop模式下的Activity實例,則將Intent發送給該實例,不會再創建Activity的新實例。
還是使用之前的代碼,只是設置A_Activity的啟動模式為singleTop:android:launchMode="singleTop",運行之,請看下圖:
這個時候我們無論點擊多少次button,textView都顯示同一個Activity實例,按回退鍵時會直接退出程序,表明在singleTop模式下,如果在棧頂存在Intent中那個目標Activity的實例,就不會創建新的實例,而直接使用棧頂的對象,對于資源有限的移動設備來說,也是有實際意義的。
如果是在不同Activity之間跳轉,就會跟standard模式的情形一樣,請看下面代碼:
public class A_Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView=new TextView(this);
textView.setText(this+"");
Button button=new Button(this);
button.setText("Go B_Activity");
button.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent();
intent.setClass(A_Activity.this, B_Activity.class);//從A跳轉到B
startActivity(intent);
}
});
LinearLayout layout=new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(textView);
layout.addView(button);
setContentView(layout);
}
}
public class B_Activity extends Activity {
/**<li>Description: </li>
*
* @param savedInstanceState
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
TextView textView=new TextView(this);
textView.setText(this+"");
Button button=new Button(this);
button.setText("Go A_Activity");
button.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent();
intent.setClass(B_Activity.this, A_Activity.class);//從B跳轉到A
startActivity(intent);
}
});
LinearLayout layout=new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(textView);
layout.addView(button);
setContentView(layout);
}
}
運行后,如下圖:
點擊button后:
再點擊button后:
這樣每次都會創建目標Activity的新實例,因為在跳轉時,處于棧頂的對象不是目標Activity的實例
三、singleTask
singleTask模式只能創建一個實例,當發送一個Intent,目標Activity為singleTask模式時,系統會檢查棧里面是否已經有該Activity的實例,如果有就直接將Intent發送給它,還是使用(二)中的代碼,將A_Activity啟動模式設置為singleTask,B_Activity啟動模式設置為standard,啟動后如下圖:
點擊button后:
繼續點擊button:
由此可知,singleTask模式的A_Activity在棧中只有一個實例,可以被重復使用
并且,如果收到Intent生成一個新實例,那么用戶可以通過回退鍵回到上一個狀態,如果是已經存在的一個activity來處理這個Intent的話,就無法通過回退鍵回到上一個狀態(對singleInstance同樣適用) ,比如剛才最后一步如果再按回退鍵,就會直接退出程序,而不會回到上一步的狀態。
四、singleInstance
這個模式下的Activity在一個單獨的task棧中,這個棧也只能包含一個Activity的實例,將上面代碼稍微改動一下,顯示taskId:
A_Activity 中:textView.setText(this.getTaskId()+"");
B_Activity 中:textView.setText(this.getTaskId()+"");
另外將B_Activity 設置為singleInstance模式,A_Activity 設置為standard模式,啟動后:
點擊button后:
表明啟動了新的task
總結四個模式的不同:
1、Intent的目標Activity由哪個task持有
standard與singleTop的Activity所在task,與收到的Intent的發送者所在task相同,除非Intent包括參數FLAG_ACTIVITY_NEW_TASK,該參數會啟動Activity到新的task中;singleTask和singleInstance總是把Activity作為一個task的根元素,它們不會被啟動到其他task里
2、是否允許Activity的多個實例
standard與singleTop可以被實例化多次,可以存在不同task中,并且一個task可以包括同一activity的多個實例
singleTask與singleInstance則在同一個task中只能允許Activity的一個實例,并且是task的根元素
3、在同一個task棧中,是否允許其他Activity的實例存在
singleInstance單獨在一個task中,其他啟動模式允許不同Activity的實例存在
4、是否每次生成新實例接收Intent
standard每次啟動都會生成新實例
singleTop的activity如果在task的棧頂的話,則不生成新的activity實例,直接使用該實例,否則,就要生成新的實例
singleInstance在所在棧中是唯一的activity,它每次都會被重用
singleTask如果task棧中有該模式的Activity,就不生成新的activity實例,直接使用該實例,否則,就要生成新的實例
轉載:http://blog.csdn.net/leiswpu/article/details/6248528
1. reference:參考某一資源ID。
(1)屬性定義:
<declare-styleable name = "名稱">
<attr name = "background" format = "reference" />
</declare-styleable>
(2)屬性使用:
<ImageView
android:layout_width = "42dip"
android:layout_height = "42dip"
android:background = "@drawable/圖片ID"
/>
2. color:顏色值。
(1)屬性定義:
<declare-styleable name = "名稱">
<attr name = "textColor" format = "color" />
</declare-styleable>
(2)屬性使用:
<TextView
android:layout_width = "42dip"
android:layout_height = "42dip"
android:textColor = "#00FF00"
/>
3. boolean:布爾值。
(1)屬性定義:
<declare-styleable name = "名稱">
<attr name = "focusable" format = "boolean" />
</declare-styleable>
(2)屬性使用:
<Button
android:layout_width = "42dip"
android:layout_height = "42dip"
android:focusable = "true"
/>
4. dimension:尺寸值。
(1)屬性定義:
<declare-styleable name = "名稱">
<attr name = "layout_width" format = "dimension" />
</declare-styleable>
(2)屬性使用:
<Button
android:layout_width = "42dip"
android:layout_height = "42dip"
/>
5. float:浮點值。
(1)屬性定義:
<declare-styleable name = "AlphaAnimation">
<attr name = "fromAlpha" format = "float" />
<attr name = "toAlpha" format = "float" />
</declare-styleable>
(2)屬性使用:
<alpha
android:fromAlpha = "1.0"
android:toAlpha = "0.7"
/>
6. integer:整型值。
(1)屬性定義:
<declare-styleable name = "AnimatedRotateDrawable">
<attr name = "visible" />
<attr name = "frameDuration" format="integer" />
<attr name = "framesCount" format="integer" />
<attr name = "pivotX" />
<attr name = "pivotY" />
<attr name = "drawable" />
</declare-styleable>
(2)屬性使用:
<animated-rotate
xmlns:android = "
android:drawable = "@drawable/圖片ID"
android:pivotX = "50%"
android:pivotY = "50%"
android:framesCount = "12"
android:frameDuration = "100"
/>
7. string:字符串。
(1)屬性定義:
<declare-styleable name = "MapView">
<attr name = "apiKey" format = "string" />
</declare-styleable>
(2)屬性使用:
<com.google.android.maps.MapView
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:apiKey = "0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g"
/>
8. fraction:百分數。
(1)屬性定義:
<declare-styleable name="RotateDrawable">
<attr name = "visible" />
<attr name = "fromDegrees" format = "float" />
<attr name = "toDegrees" format = "float" />
<attr name = "pivotX" format = "fraction" />
<attr name = "pivotY" format = "fraction" />
<attr name = "drawable" />
</declare-styleable>
(2)屬性使用:
<rotate
xmlns:android = "
android:interpolator = "@anim/動畫ID"
android:fromDegrees = "0"
android:toDegrees = "360"
android:pivotX = "200%"
android:pivotY = "300%"
android:duration = "5000"
android:repeatMode = "restart"
android:repeatCount = "infinite"
/>
9. enum:枚舉值。
(1)屬性定義:
<declare-styleable name="名稱">
<attr name="orientation">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
</declare-styleable>
(2)屬性使用:
<LinearLayout
xmlns:android = " android:orientation = "vertical"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
>
</LinearLayout>
10. flag:位或運算。
(1)屬性定義:
<declare-styleable name="名稱">
<attr name="windowSoftInputMode">
<flag name = "stateUnspecified" value = "0" />
<flag name = "stateUnchanged" value = "1" />
<flag name = "stateHidden" value = "2" />
<flag name = "stateAlwaysHidden" value = "3" />
<flag name = "stateVisible" value = "4" />
<flag name = "stateAlwaysVisible" value = "5" />
<flag name = "adjustUnspecified" value = "0x00" />
<flag name = "adjustResize" value = "0x10" />
<flag name = "adjustPan" value = "0x20" />
<flag name = "adjustNothing" value = "0x30" />
</attr>
</declare-styleable>
(2)屬性使用:
<activity
android:name = ".StyleAndThemeActivity"
android:label = "@string/app_name"
android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
注意:
屬性定義時可以指定多種類型值。
(1)屬性定義:
<declare-styleable name = "名稱">
<attr name = "background" format = "reference|color" />
</declare-styleable>
(2)屬性使用:
<ImageView
android:layout_width = "42dip"
android:layout_height = "42dip"
android:background = "@drawable/圖片ID|#00FF00"
/>
摘要: showDialog()調用createDialog()和onPrepareDialog(),其中createDialog()調用onCreateDialog()。例子如下所示 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ... 閱讀全文private Vibrator vibrator;
取得震動服務的句柄
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
或者 vibrator = (Vibrator)getApplication().getSystemService(Service.VIBRATOR_SERVICE);
開始震動有兩個接口
1 . vibrator.vibrate(2000);//震動指定時間 ,數據類型long,單位為毫秒,一毫秒為1/1000秒
2. vibrator.vibrate(new long[]{100,10,100,1000}, -1);//按照指定的模式去震動。
數組參數意義:第一個參數為等待指定時間后開始震動,震動時間為第二個參數。后邊的參數依次為等待震動和震動的時間
第二個參數為重復次數,-1為不重復,0為一直震動
取消震動
vibrator.cancel();//取消震動,立即停止震動
震動為一直震動的話,如果不取消震動,就算退出,也會一直震動
最重要的,增加權限,否則運行時出錯
<uses-permission android:name="android.permission.VIBRATE"/>
J2SE 5.0提供了一組atomic class來幫助我們簡化同步處理。基本工作原理是使用了同步synchronized的方法實現了對一個long, integer, 對象的增、減、賦值(更新)操作. 比如對于++運算符AtomicInteger可以將它持有的integer 能夠atomic 地遞增。在需要訪問兩個或兩個以上 atomic變量的程序代碼(或者是對單一的atomic變量執行兩個或兩個以上的操作)通常都需要被synchronize以便兩者的操作能夠被當作是一個atomic的單元。01-21 20:58:10.715: E/SubmitMessage(8010): Submit string: submit:trigger=0,bugtype=2,modulename=com.zhihe.xqsh,level=1,testtype=NORMAL,path=/data/log/unzip/H60-L01_V100R001CHNC00B307_DU2SSE1472000007_20150121205810_crash
01-21 20:58:10.940: E/HwSystemManager(3431): HoldService:mAppInfo == null
01-21 20:58:10.960: E/HwSystemManager(3431): HoldService:mAppInfo == null
01-21 20:58:12.745: E/HwLauncher(3286): Launcher dialog dismiss failed : java.lang.IllegalArgumentException: no dialog with id 1 was ever shown via Activity#showDialog
01-21 20:58:15.230: E/Thermal-daemon(2421): [ap] temp_new :35 temp_old :34
01-21 20:58:20.230: E/Thermal-daemon(2421): [ap] temp_new :34 temp_old :35
01-21 20:58:20.235: E/Thermal-daemon(2421): Report temperature: [ap] temp :34 report_threshold:1
當用到FinalBitmap時,及對圖片進行異步緩存的情況下,第三方包可能用到了存儲卡
標簽用于指定屏幕內的焦點View。
例如我們點擊tab鍵或enter鍵焦點自動進入下一個輸入框
用法: 將標簽置于Views標簽內部
- onFinishInflate() 當View中所有的子控件均被映射成xml后觸發
- onMeasure( int , int ) 確定所有子元素的大小
- onLayout( boolean , int , int , int , int ) 當View分配所有的子元素的大小和位置時觸發
- onSizeChanged( int , int , int , int ) 當view的大小發生變化時觸發
- onDraw(Canvas) view渲染內容的細節
- onKeyDown( int , KeyEvent) 有按鍵按下后觸發
- onKeyUp( int , KeyEvent) 有按鍵按下后彈起時觸發
- onTrackballEvent(MotionEvent) 軌跡球事件
- onTouchEvent(MotionEvent) 觸屏事件
- onFocusChanged( boolean , int , Rect) 當View獲取或失去焦點時觸發
- onWindowFocusChanged( boolean ) 當窗口包含的view獲取或失去焦點時觸發
- onAttachedToWindow() 當view被附著到一個窗口時觸發
- onDetachedFromWindow() 當view離開附著的窗口時觸發,Android123提示該方法和 onAttachedToWindow() 是相反的。
- onWindowVisibilityChanged( int ) 當窗口中包含的可見的view發生變化時觸發
標簽用于指定屏幕內的焦點View。
例如我們點擊tab鍵或enter鍵焦點自動進入下一個輸入框
用法: 將標簽置于Views標簽內部
android:ems = "10" 設置TextView或者Edittext的寬度為10個字符的寬度。當設置該屬性后,控件顯示的長度就為10個字符的長度,超出的部分將不顯示。
轉載:http://blog.sina.com.cn/s/blog_90cdca4c01011kdc.html
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 | |||
8 | 9 | 10 | 11 | 12 | 13 | 14 | |||
15 | 16 | 17 | 18 | 19 | 20 | 21 | |||
22 | 23 | 24 | 25 | 26 | 27 | 28 | |||
29 | 30 | 1 | 2 | 3 | 4 | 5 |
常用鏈接
留言簿(2)
隨筆分類
- Android(49)
- Androidpn(2)
- hibernate(1)
- Https(1)
- JavaCard(3)
- jQuery(6)
- netty
- NFC(1)
- react框架(1)
- spring(2)
- SpringBoot(1)
- Tomcat+Eclipse(18)
- WebService(2)
- 一些心得(1)
隨筆檔案
- 2020年4月 (4)
- 2015年7月 (5)
- 2015年6月 (6)
- 2015年5月 (4)
- 2015年4月 (3)
- 2015年3月 (1)
- 2015年2月 (1)
- 2015年1月 (4)
- 2014年12月 (1)
- 2014年11月 (2)
- 2014年10月 (2)
- 2014年9月 (2)
- 2014年5月 (5)
- 2014年3月 (3)
- 2014年2月 (2)
- 2014年1月 (8)
- 2013年12月 (2)
- 2013年7月 (2)
- 2013年6月 (4)
- 2013年5月 (16)
- 2012年7月 (1)
- 2012年3月 (2)
- 2011年7月 (6)
文章分類
文章檔案
相冊
收藏夾
Java
搜索
最新隨筆
最新評論

- 1.?re: Android JSON的簡單例子
- 評論內容較長,點擊標題查看
- --JSON.COM
- 2.?re: androidpn(本文服務器為tomcat)
- 評論內容較長,點擊標題查看
- --Deepak Singh