上一節(jié)中我們對Activity一些基本的概念進(jìn)行了了解绍坝,什么是Activity徘意,Activity的生命周期,如何去啟動一個Activity等轩褐,本節(jié)我們繼續(xù)來學(xué)習(xí)Activity椎咧,前面也講了一個App一般都是有多個Activity構(gòu)成的,這就涉及到了多個Activity間數(shù)據(jù)傳遞的問題了把介,那么本節(jié)繼續(xù)學(xué)習(xí)Activity的使用勤讽!另外關(guān)于傳遞集合,對象拗踢,數(shù)組地技,Bitmap的我們會在Intent那里進(jìn)行講解,這里只介紹如何傳遞基本數(shù)據(jù)秒拔!
1. Activity間的數(shù)據(jù)傳遞:
代碼示例:
https://github.com/pifoo/AndroidStudioProjects-Hi/tree/master/activity
2. 多個Activity間的交互(后一個傳回給前一個)
代碼示例:(TODO)
https://github.com/pifoo/AndroidStudioProjects-Hi/tree/master/activity
3. 知曉當(dāng)前是哪個Activity
4. 隨時關(guān)閉所有Activity
有時我們可能會打開了很多個Activity莫矗,突然來個這樣的需求,在某個頁面可以關(guān)掉 所有的Activity并退出程序砂缩!好吧作谚,下面提供一個關(guān)閉所有Activity的方法, 就是用一個list集合來存儲所有Activity!
代碼如下:
public class ActivityCollector {
public static LinkedList<Activity> activities = new LinkedList<Activity>();
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for(Activity activity:activities){
if(!activity.isFinishing()){
activity.finish();
}
}
}
}
5. 完全退出App的方法
上面說的是關(guān)閉所有Activity的庵芭,但是有些時候我們可能想殺死整個App妹懒,連后臺任務(wù)都?xì)⑺?殺得一干二凈的話,可以使用搭配著下述代碼使用:
實現(xiàn)代碼:
/**
* 退出應(yīng)用程序
*/
public void AppExit(Context context) {
try {
ActivityCollector.finishAll();
ActivityManager activityMgr = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
activityMgr.killBackgroundProcesses(context.getPackageName());
System.exit(0);
} catch (Exception ignored) {}
}
6. 雙擊退出程序的兩種方法:
1)定義一個變量双吆,來標(biāo)識是否退出
// 定義一個變量眨唬,來標(biāo)識是否退出
private static boolean isExit = false;
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
isExit = false;
}
};
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (!isExit) {
isExit = true;
Toast.makeText(getApplicationContext(), "再按一次退出程序",
Toast.LENGTH_SHORT).show();
// 利用handler延遲發(fā)送更改狀態(tài)信息
mHandler.sendEmptyMessageDelayed(0, 2000);
} else {
exit(this);
}
return false;
}
return super.onKeyDown(keyCode, event);}
2)保存點(diǎn)擊時間
//保存點(diǎn)擊的時間
private long exitTime = 0;
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if ((System.currentTimeMillis() - exitTime) > 2000) {
Toast.makeText(getApplicationContext(), "再按一次退出程序",
Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
exit();
}
return false;
}
return super.onKeyDown(keyCode, event);
}
7. 為Activity設(shè)置過場動畫
所謂的過場動畫就是切換到另外的Activity時加上一些切換動畫会前,比如淡入淡出,放大縮小匾竿,左右互推等瓦宜! 當(dāng)然,我們并不在這里詳細(xì)講解動畫岭妖,后面有專門的章節(jié)來講解這個临庇,這里只教大家如何去加載動畫,另外 給大家提供了一些比較常用的過渡動畫昵慌,只要將相關(guān)動畫文件添加到res/anim目錄下假夺,然后下述方法二選一 就可以實現(xiàn)Activity的切換動畫了!
1)方法一:
2) 方法二:
通過style進(jìn)行配置斋攀,這個是全局的哦已卷,就是所有的Activity都會加載這個動畫!
實現(xiàn)代碼如下:
①在style.xml中自定義style:
<!-- 默認(rèn)Activity跳轉(zhuǎn)動畫 -->
<style name="default_animation" mce_bogus="1" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/default_anim_in</item>
<item name="android:activityOpenExitAnimation">@anim/anim_stay</item>
<item name="android:activityCloseEnterAnimation">@anim/anim_stay</item>
<item name="android:activityCloseExitAnimation">@anim/default_anim_out</item>
</style>
解釋:
4個item分別代表:
- Activity A跳轉(zhuǎn)到Activity B時Activity B進(jìn)入動畫;
- Activity A跳轉(zhuǎn)到Activity B時Activity A退出動畫;
- Activity B返回Activity A時Activity A的進(jìn)入動畫
- Activity B返回Activity A時ActivityB的退出動畫
②然后修改下AppTheme:
<style name="AppTheme" mce_bogus="1" parent="@android:style/Theme.Light">
<item name="android:windowAnimationStyle">@style/default_animation</item>
<item name="android:windowNoTitle">true</item>
</style>
③最后在appliction設(shè)置下
<application
android:icon="@drawable/logo"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
好的淳蔼,動畫特效就這樣duang一聲設(shè)置好了~
3)其他
好的悼尾,除了上面兩種方法以外,還可以使用TransitionManager來實現(xiàn)肖方,但是需求版本是API 19以上的闺魏, 另外還有一種addOnPreDrawListener的轉(zhuǎn)換動畫,這個用起來還是有點(diǎn)麻煩的俯画,可能不是適合初學(xué)者 這里也不講析桥,最后提供下一些常用的動畫效果打包,選擇需要的特效加入工程即可艰垂! Activity常用過渡動畫.zip
8. Bundle傳遞數(shù)據(jù)的限制
在使用Bundle傳遞數(shù)據(jù)時泡仗,要注意,Bundle的大小是有限制的 < 0.5MB猜憎,如果大于這個值 是會報TransactionTooLargeException異常的C湓酢!胰柑!
9. 使用命令行查看當(dāng)前所有Activity的命令:
使用下述命令即可截亦,前提是你為SDK配置了環(huán)境變量:adb shell dumpsys activity
10. 設(shè)置Activity全屏的方法:
1)代碼隱藏ActionBar
在Activity的onCreate方法中調(diào)用getActionBar.hide();即可
2)通過requestWindowFeature設(shè)置
requestWindowFeature(Window.FEATURE_NO_TITLE); 該代碼需要在setContentView ()之前調(diào)用,不然會報錯<硖帧1廊俊!
3)通過AndroidManifest.xml的theme
在需要全屏的Activity的標(biāo)簽內(nèi)設(shè)置 theme = @android:style/Theme.NoTitleBar.FullScreen
11. onWindowFocusChanged方法妙用
我們先來看下官方對這個方法的介紹:
就是踩官,當(dāng)Activity得到或者失去焦點(diǎn)的時候却桶,就會回調(diào)該方法! 如果我們想監(jiān)控Activity是否加載完畢,就可以用到這個方法了~
想深入了解的可移步到這篇文章: onWindowFocusChanged觸發(fā)簡介
12. 定義對話框風(fēng)格的Activity
在某些情況下颖系,我們可能需要將Activity設(shè)置成對話框風(fēng)格的嗅剖,Activity一般是占滿全屏的,
而Dialog則是占據(jù)部分屏幕的嘁扼!實現(xiàn)起來也很簡單信粮!
直接設(shè)置下Activity的theme:
android:theme="@android:style/Theme.Dialog"
這樣就可以了,當(dāng)然你可以再設(shè)置下標(biāo)題偷拔,小圖標(biāo)蒋院!
//設(shè)置左上角小圖標(biāo)
requestWindowFeature(Window.FEATURE_LEFT_ICON);
setContentView(R.layout.main);
getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, android.R.drawable.ic_lion_icon);
//設(shè)置文字:
setTitle(R.string.actdialog_title); //XML代碼中設(shè)置:android:label="@string/activity_dialog"
總結(jié)
本節(jié)我們又學(xué)習(xí)了一下Activity在實際開發(fā)中的一些常見問題亏钩,相信在實際開發(fā)中會幫到大家的莲绰!
下節(jié)我們來學(xué)習(xí)Activty的棧的概念,以及四種加載模式姑丑!敬請期待謝謝