一民珍、創(chuàng)建Activity步驟:
二襟士、采用Intent切換activity?
1盗飒、顯式Intent?
2、隱式Intent?
3陋桂、隱式Intent的其他用法?
三逆趣、Intent傳遞數(shù)據(jù)?
1、向下一個activity傳遞數(shù)據(jù)?
2章喉、返回數(shù)據(jù)給上一個activity?
四汗贫、activity的生命周期?
1、活動狀態(tài)?
2秸脱、activity生存期?
3落包、activity被回收數(shù)據(jù)保存?
五、activity的啟動模式?
六摊唇、activity最佳實踐?
1咐蝇、知道當前頁面是哪一個activity?
2、隨時隨地退出程序?
3巷查、給每個activity都添加一個合適的啟動方法?
等級:小菜鳥有序,經(jīng)驗值+600;
書簽:從看得見的開始岛请,開始探討活動旭寿。
輸出:了解Activity
正文:
第二章Activity
Activity是包含用戶界面的組件,用于和用戶進行交互崇败。
一盅称、創(chuàng)建Activity步驟:
1、首先后室,創(chuàng)建沒有Activity的application缩膝,發(fā)現(xiàn)src文件夾是空的。手動創(chuàng)建一個包com.example.demo1activity岸霹,在包中添加一個class疾层,MainActivity.java。
要使用activity贡避,extents Activity痛黎。此時,重寫Activity的onCreate()方法刮吧。
2舅逸、此時,只有activity皇筛,用戶是不可見的琉历。因此,需要在上面添加layout和view。在res-->layout中添加一個Android XML file旗笔,可以在該xml文件中創(chuàng)建布局彪置。添加諸如TextView/Button等常用控件。
3蝇恶、此時拳魁,需要將創(chuàng)建的layout文件加載到activity中,在第一步創(chuàng)建的MainActivity中onCreate()方法中撮弧,使用setContentView(R.layout.myactivity)將布局加載進來潘懊。
4、所有四大組件的使用贿衍,都需要在AndroidManifest.xml文件中注冊授舟。
注冊方法為:
在中添加標簽,將需要注冊的activity使用android:name=".MainActivity"注冊贸辈。如果是主activity释树,即打開application時看到的activity,則需要添加
總體注冊代碼為:
android:name=".MainActivity"
android:label="My App">
5擎淤、銷毀activity
finish();
二奢啥、采用Intent切換activity
1、顯式Intent
首先嘴拢,按照上面的步驟重新創(chuàng)建一個SecondActivity(記得注冊)桩盲,采用Intent實現(xiàn)跳轉(zhuǎn)
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
2、隱式Intent
隱式Intent并不能實現(xiàn)直接跳轉(zhuǎn)席吴,需要指定兩個條件(intent-filter):action和category正驻。
如果在intent-filter中指定category為default的category,即android.intent.category.DEFAULT抢腐,則只需滿足action條件即可。
intent-filter在注冊activity時添加襟交,注冊方法如下:
跳轉(zhuǎn)方法為:
Intent intent=new Intent("com.example.demo1activity.SECOND_START");
startActivity(intent);
intentfilter中只能有一個action迈倍,但可以有多個category,滿足其中一個category即可捣域。
3啼染、隱式Intent的其他用法
使用隱式intent,不但可以打開自己編寫的activity焕梅,還可以打開系統(tǒng)編寫的activity迹鹅,比如瀏覽器,打電話等贞言。
打開瀏覽器:
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
解釋:
Intent.ACTION_VIEW是系統(tǒng)內(nèi)置的動作斜棚,打開瀏覽器;
setData()將一個Uri對象傳入intent,用于指定該intent正在操作的數(shù)據(jù)弟蚀,這些數(shù)據(jù)都是用Uri.parse()將字符串轉(zhuǎn)換為Uri產(chǎn)生的蚤霞。
在intent-filter中,添加標簽义钉,用于精確指定該activity能響應(yīng)的數(shù)據(jù)類型昧绣,包括
android:scheme用于指定數(shù)據(jù)的協(xié)議部分,比如http捶闸。
該方法還可以打電話夜畴、顯示地理位置等。
在頭一個activity中,使用putExtra()將數(shù)據(jù)傳入intent
在下一個activity中醉锅,使用getIntent()獲得傳遞來的intent兔簇,然后使用getStringExtra()獲得傳遞來的數(shù)據(jù)。
在上一個activity中垄琐,不采用startActivity(),而采用startActivityForResult(intent, 1)经柴。其中狸窘,1為requestCode,用于之后判斷是不是自己發(fā)送出去的intent坯认。
在下一個activity中翻擒,建立新的intent,然后將data利用intent.putExtra()放入intent牛哺,
setResult(RESULT_OK, intent)放置result陋气,其中RESULT_OK為resultcode,用于在上一個activity中分辨是哪一個activity返回的數(shù)據(jù)引润。最后巩趁,finish()。
之后淳附,在上一個activity中议慰,重寫onActivityResult()方法。
同樣的奴曙,如果在第二個activity中别凹,是按返回鍵返回的,可以在第二個activity中洽糟,重寫onBackPressed()方法返回數(shù)據(jù)炉菲,方法同上堕战。
運行狀態(tài):在棧頂時
暫停狀態(tài):不可操作践啄,但可見
停止狀態(tài):完全不可見
銷毀狀態(tài):從棧中被移除
完整生存期:onCreate() onDestory()
可見生存期:onStart() onStop()
前臺生存期:onResume() onPause()
activity中提供了一個onSaveInstanceState()的方法屿讽,該方法會攜帶一個bundle類型參數(shù),bundle可以保存各種信息吠裆。
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String savedata="hello you";
outState.putString("saved", savedata);
}
如何恢復(fù)數(shù)據(jù)呢伐谈?
在onCreate()方法中,傳入的參數(shù)為Bundle savedInstanceState试疙,利用這恢復(fù)數(shù)據(jù)诵棵。
String data=savedInstanceState.getString(“saved”);
四種啟動模式祝旷,可以在標簽中android:launchMode定義履澳。
standard:打開activity,就放入棧頂
singleTop:打開activity怀跛,檢查棧頂是否已經(jīng)存在該activity距贷,存在了就不創(chuàng)建。不存在才創(chuàng)建吻谋。不過忠蝗,如果該activity不在棧頂,但也存在漓拾,則也會重新創(chuàng)建一個阁最。
singleTask:檢查整個返回棧,如果存在某個activity骇两,則不會重新創(chuàng)建速种。
singleInstance:創(chuàng)建一個activity,重新在一個新的返回棧(或Task)中創(chuàng)建低千,該activity與其他activity不在同一個Task中配阵,其他程序也可以調(diào)用這個activity的實例。
新建一個BaseActivity extents Activity饱亮,其中在onCreate()中打印該activity的信息
Log.i(“BaseActivity”,getClass().getSimpleName()); ??//獲得類名
然后矾芙,所有activity都extents BaseActivity即可
當打開很多activity之后近上,退出程序需要一直按Back剔宪,很麻煩。
首先,新建一個activity管理類葱绒,實現(xiàn)所有的activity的添加感帅、刪除和finish()。
public class ActivityCollector {
public static List activities=new ArrayList();
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();
}
}
}
}
然后地淀,修改BaseActivity失球,在onCreate()中添加this,onDestory()中移除this
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.i("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
ActivityCollector.removeActivity(this);
}
比如我需要啟動一個SecondActivity实苞,可是不知道該activity需要哪些參數(shù),怎么辦烈疚?
在SecondActivity中添加一個啟動自己的方法:
public class SecondActivity extends Activity
{
…
public static void startActivity(Context contex, String data1, String data2)
{
Intent intent = new Intent(context, SecondActicity.class);
intent.putExtra(“param1”, data1);
intent.putExtra(“param2”, data2);
startActivity(intent);
}
}
在SecondActivity中添加了startActivity()方法之后黔牵,在任意的activity中啟動SecondActivity,都可以調(diào)用該方法爷肝,而且知道需要傳入哪些參數(shù)猾浦。
比如在MainActivity中啟動方法為:
SecondActivity.startActivity(MainActivity.this, “data1”, “data2”);