Android基礎知識:Activity(3)Activity之間的跳轉
本文我們來學習Activity之間的跳轉
主界面放一個Button,用于跳轉,Second界面就放一個TextView
MainActivity.java
activity_main.xml
SecondActivity.java
activity_cond.xml
AndroidMainfest.xml
界面跳轉主要是通過構建Intent,然后調用Activity的startActivity方法去啟動
Intent接收兩個參數,一個是Context,一個是需要跳轉的Activity(Context有三種,分別是Application、Activity、Service,具體區別之后會發專門的文章來分析)
隱式啟動也需要構建Intent,不過Intent傳入的參數是一串字符,這串字符是由你自己定義的
我們先來修改AndroidManifest.xml
action自定義一個字符串,按自己喜歡的風格命名就行了
categroy也是由自己定義,但這里我們就用一個默認的字符串
接著修改MainActivity.java
注意這個Intent傳入的參數要和之前定義的action一樣
如果在AndroidManifest.xml中加了自己的category,那么就要這樣寫
我們在啟動時要匹配所有的category才能啟動
這時,你會發現我沒有將android.intent.category.DEFAULT加進去
這是因為startActivity的時候,系統會自動自動幫我們加上
這個就是隱式啟動。
安卓開發:如何得知當前activity是被壓入后臺,還是跳轉到新的activity?
最近學習安卓開發activity的生命周期,對單個活動的生命周期較為熟悉。此時師兄拋出問題,當一個activity進入 onStop() 時,如何得知時由于用戶點擊了主頁鍵,還是由于進入了另一個本程序的activity?
查閱網絡資源后,得知可以通過安卓本身的多種方法來判斷。不過某些方法的使用需要獲取用戶授權,或者需要較高版本的安卓系統。不過本文主要介紹通過activity本身的生命周期回調函數來判斷。
由于設計兩個activity的跳轉,所以我們應該去考慮多個activity的生命周期回調函數順序。查閱并測試可知,當進行activity跳轉時,先執行原來activity的 onPau() 和,然后執行第二個activity的 onCreate() 、 onStart() 、 onResume() ,再執行第一個activity的 onStop 。如圖所示,紅色是第一個activity的回調函數執行,藍色是第二個。
我們可以利用這個特點,通過一個static變量來記錄當前run的activity數量,當這個數量為0的時候,即程序被壓入后臺,當這個數量不為0,則表明當前執行了一個跳轉操作。
首先新建一個 BaActivity 類,聲明一個static變量,讓別的activity全部繼承。并在 onStart() 和 onStop() 中修改 count 。
創建 MainActivity 類,繼承自 BaActivity 類,同時修改 onStop() ,檢查 count 的值,判斷此次導致 onStop() 的原因。我在這個activity中添加了一個button用于跳轉到第二個activity。
這個類很簡單,沒有什么功能,只是跳轉過來后,執行基類的 onCreate() 方法。
至此,我們便實現了通過activity生命周期回調函數判斷是否被壓入后臺。不過,后來學長針對我的這種方式提出了漏洞——當引用外部SDK,且外部SDK中可以彈出未繼承我們自定義的ba基類的activity,那么怎么處理這種情況呢?這里就要用到安卓SDK提供的全局生命周期類了——Application.registerActivityLifecycleCallbaks,這里我們之后再談。
跳轉activity,或退出時會閃屏
WindowManager: Screenshot failure taking screenshot for (240x240) to layer 21010
I/WindowManager: Failed to capture screenshot of Token{efb2ca8 ActivityRecord{
解題思路:
1.這個問題一開始以為是堆棧的問題導致,所以各種啟動模式嘗試下來,絲毫沒有改變閃屏的跡象。
2.查看activity的啟動流程,總結下來,跟這一塊也沒關系。
3.最終通過查看log得知,截圖失敗,那為什么跳轉actvity還要截圖呢,哈哈,因為android 系統默認是有跳轉動畫的。So ,找到了原因,有兩種解決方法,1,直接去掉跳轉activity動畫,2.修復截圖失敗的bug.
總結:解決問題要先從log入手。
Android 跳轉至第三方應用指定的Activity
方法一:知道第三方應用的報名和需要跳轉的Activity名
Intent redIntent=new Intent();
redIntent.tClassName("com.example.ht380d4G_jar_demo", "com.meter.MeterActivity");
方法二:不使用Activity名,用action
Intent redIntent=new Intent();
redIntent.tAction("com.jb.MeterActivity");
redIntent.addCategory("android.intent.category.DEFAULT");
redIntent.tPackage("com.example.ht380d4G_jar_demo");
Activity A 跳轉Activity B,Activity B再按back鍵回退,兩個過程各自的生命周期
ActivityB是個窗口Activity的情況下,1、2的結論呢?
若ActivityB是個窗口,ActivityA跳轉到ActivityB時,ActivityA失去焦點部分可見,故不會調用onStop,此時生命周期順序: A.onPau -> B.onCreate -> B.onStart-> B.onResume
按下Back鍵后:B.onPau->A.onResume->B.onStop->B.onDestory
切換橫豎屏時,onCreate會調用嗎?幾次?
程序在運行時,一些設備的配置可能會改變,如:橫豎屏的切換、鍵盤的可用性或語言的切換等,此時Activity會重新啟動。其中的過程是:在銷毀之前會先調用onSaveInstancestate()去保存應用中的一些數據,然后調用 onDestory(),最后才會去調用onCreate()或者onRestoreInstanceState方法重新啟動Activiy。在切換屏幕時候會重新調用各個生命周期, 切橫屏時會執行一次onCreate,切豎屏時會執行兩次onCreate。
安卓應用開發中Activity之間怎么用按鈕進行跳轉?
activity的跳轉一般有兩種方式,一種是用action的隱式跳轉,還有種就是用類名做的顯式跳轉。
對于初學者來說(比如我)還是比較喜歡用顯式跳轉,因為比較方便,也不用配置那么多的東西
Intent intent = new Intent(當前activity.this,要跳轉到的activity.class);
startActivity(intent);
這樣就能跳轉過去了。
按鈕的操作,就是給按鈕做一個點擊事件
btn.tOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
然后把跳轉的那一條語句放到這里面
btn.tOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(當前activity.this,要跳轉到的activity.class);
startActivity(intent);
}
});
跳轉就完成了。
關于隱式和顯示跳轉之間的關系還有方式可以到下面的鏈接去看看http://blog.sina.com.cn/s/blog_5d2e69770102v0ra.html