Android Activity初窺門徑

2023-03-31 13:45 更新

本節(jié)引言:

上一節(jié)中我們對(duì)Activity一些基本的概念進(jìn)行了了解,什么是Activity,Activity的生命周期,如何去啟動(dòng)一個(gè)Activity等,本節(jié)我們繼續(xù)來(lái)學(xué)習(xí)Activity,前面也講了一個(gè)App一般都是又多個(gè)Activity構(gòu)成的,這就涉及到了多個(gè)Activity間數(shù)據(jù)傳遞的問(wèn)題了,那么本節(jié)繼續(xù)學(xué)習(xí)Activity的使用!另外關(guān)于傳遞集合,對(duì)象,數(shù)組,Bitmap的我們會(huì)在Intent那里進(jìn)行講解,這里只介紹如何傳遞基本數(shù)據(jù)!


1.Activity間的數(shù)據(jù)傳遞:

代碼示例:

效果圖:

代碼下載:ActivityTest1.zip


2.多個(gè)Activity間的交互(后一個(gè)傳回給前一個(gè))

代碼示例:

效果圖:

代碼下載:ActivityTest2.zip


3.知曉當(dāng)前是哪個(gè)Activity


4.隨時(shí)關(guān)閉所有Activity

有時(shí)我們可能會(huì)打開(kāi)了很多個(gè)Activity,突然來(lái)個(gè)這樣的需求,在某個(gè)頁(yè)面可以關(guān)掉 所有的Activity并退出程序!好吧,下面提供一個(gè)關(guān)閉所有Activity的方法, 就是用一個(gè)list集合來(lái)存儲(chǔ)所有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的方法

上面說(shuō)的是關(guān)閉所有Activity的,但是有些時(shí)候我們可能想殺死整個(gè)App,連后臺(tái)任務(wù)都?xì)⑺?殺得一干二凈的話,可以使用搭配著下述代碼使用:

實(shí)現(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)定義一個(gè)變量,來(lái)標(biāo)識(shí)是否退出

// 定義一個(gè)變量,來(lái)標(biāo)識(shí)是否退出
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)擊時(shí)間:

//保存點(diǎn)擊的時(shí)間
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è)置過(guò)場(chǎng)動(dòng)畫

所謂的過(guò)場(chǎng)動(dòng)畫就是切換到另外的Activity時(shí)加上一些切換動(dòng)畫,比如淡入淡出,放大縮小,左右互推等! 當(dāng)然,我們并不在這里詳細(xì)講解動(dòng)畫,后面有專門的章節(jié)來(lái)講解這個(gè),這里只教大家如何去加載動(dòng)畫,另外 給大家提供了一些比較常用的過(guò)渡動(dòng)畫,只要將相關(guān)動(dòng)畫文件添加到res/anim目錄下,然后下述方法二選一 就可以實(shí)現(xiàn)Activity的切換動(dòng)畫了!

1)方法一:

2)方法二:

通過(guò)style進(jìn)行配置,這個(gè)是全局的哦,就是所有的Activity都會(huì)加載這個(gè)動(dòng)畫!

實(shí)現(xiàn)代碼如下:

①在style.xml中自定義style:

<!-- 默認(rèn)Activity跳轉(zhuǎn)動(dòng)畫 -->
<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個(gè)item分別代表:

  • Activity A跳轉(zhuǎn)到Activity B時(shí)Activity B進(jìn)入動(dòng)畫;
  • Activity A跳轉(zhuǎn)到Activity B時(shí)Activity A退出動(dòng)畫;
  • Activity B返回Activity A時(shí)Activity A的進(jìn)入動(dòng)畫
  • Activity B返回Activity A時(shí)ActivityB的退出動(dòng)畫

②然后修改下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" >

好的,動(dòng)畫特效就這樣duang一聲設(shè)置好了~

3)其他

好的,除了上面兩種方法以外,還可以使用TransitionManager來(lái)實(shí)現(xiàn),但是需求版本是API 19以上的, 另外還有一種addOnPreDrawListener的轉(zhuǎn)換動(dòng)畫,這個(gè)用起來(lái)還是有點(diǎn)麻煩的,可能不是適合初學(xué)者 這里也不講,最后提供下一些常用的動(dòng)畫效果打包,選擇需要的特效加入工程即可! Activity常用過(guò)渡動(dòng)畫.zip


8.Bundle傳遞數(shù)據(jù)的限制

在使用Bundle傳遞數(shù)據(jù)時(shí),要注意,Bundle的大小是有限制的 < 0.5MB,如果大于這個(gè)值 是會(huì)報(bào)TransactionTooLargeException異常的?。?!


9.使用命令行查看當(dāng)前所有Activity的命令:

使用下述命令即可,前提是你為SDK配置了環(huán)境變量:adb shell dumpsys activity


10.設(shè)置Activity全屏的方法:

1)代碼隱藏ActionBar

在Activity的onCreate方法中調(diào)用getActionBar.hide();即可

2)通過(guò)requestWindowFeature設(shè)置

requestWindowFeature(Window.FEATURE_NO_TITLE); 該代碼需要在setContentView ()之前調(diào)用,不然會(huì)報(bào)錯(cuò)!??!

3)通過(guò)AndroidManifest.xml的theme

在需要全屏的Activity的標(biāo)簽內(nèi)設(shè)置 theme = @android:style/Theme.NoTitleBar.FullScreen


11.onWindowFocusChanged方法妙用:

我們先來(lái)看下官方對(duì)這個(gè)方法的介紹:

就是,當(dāng)Activity得到或者失去焦點(diǎn)的時(shí)候,就會(huì)回調(diào)該方法! 如果我們想監(jiān)控Activity是否加載完畢,就可以用到這個(gè)方法了~ 想深入了解的可移步到這篇文章: onWindowFocusChanged觸發(fā)簡(jiǎn)介


12.定義對(duì)話框風(fēng)格的Activity

在某些情況下,我們可能需要將Activity設(shè)置成對(duì)話框風(fēng)格的,Activity一般是占滿全屏的, 而Dialog則是占據(jù)部分屏幕的!實(shí)現(xiàn)起來(lái)也很簡(jiǎ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é):

好的,本節(jié)我們又學(xué)習(xí)了一下Activity在實(shí)際開(kāi)發(fā)中的一些常見(jiàn)問(wèn)題,相信在實(shí)際開(kāi)發(fā)中會(huì)幫到大家的! 下節(jié)我們來(lái)學(xué)習(xí)Activty的棧的概念,以及四種加載模式!敬請(qǐng)期待~謝謝~


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)