第 2 章 先從看得到的入手弥姻,探究活動
一:在活動中使用 Menu
- (創(chuàng)建菜單布局)在 res 目錄下新建一個 menu 文件夾廊散,右擊 menu文件夾→New→Android XML File
- xml文件內(nèi)容為
<menu xmlns:android="http://schemas.android.com/apk/res/android" >//**有別于其他布局,這里是menu**
<item //** 這里是item **
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
- (oncreate載入布局)在代碼中重寫 onCreateOptionsMenu()方法(通過 getMenuInflater方法能夠得到 MenuInflater對象,再調(diào)用它的 inflate方法就可以給當前活動創(chuàng)建菜單了。)
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
- (菜單點擊事件)在代碼中重寫 onOptionsItemSelected()方法
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.add_item:
Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
二:Intent
- 顯示Intent (略)
- 隱式Intent (廣播、服務都有用到)
- 通過在標簽下配置內(nèi)容肾筐,可以指定當前活動能夠響應的action和category(只有同時能夠匹配上Intent中指定的action和category時,這個活動才能響應該 Intent)
- 調(diào)用時:
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
-
注:每個 Intent中只能指定一個 action缸剪,但卻能指定多個 category吗铐。
調(diào)用時添加:
intent.addCategory("com.example.activitytest.MY_CATEGORY");
- 更多隱式 Intent 的用法(調(diào)用系統(tǒng)的瀏覽器來打開這個網(wǎng)頁)
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
-
注:我們還可以在<intent-filter>標簽中再配置一個<data>標簽,用于更精確地指定當前活動能夠響應什么類型的數(shù)據(jù)杏节。<data>標簽中主要可以配置以下內(nèi)容唬渗。
- android:scheme
- android:host
- android:port
- android:path
- android:mimeType
三:返回數(shù)據(jù)給上層activity
- 界面1:startActivityForResult(intent, 1);
- 界面2:退出時
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
- 注:要重寫onBackPressed方法,否則返回鍵就不會返回數(shù)據(jù)
- 界面1:重寫onActivityResult方法奋渔,提取數(shù)據(jù)镊逝。
if (resultCode == RESULT_OK) String returnedData = data.getStringExtra("data_return");
四: DialogActivity (將普通activity變?yōu)镈ialogActivity)###
- 修改該Activity的清單文件為:
<activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dialog" >
- 注:如果修改該DialogActivity的布局就可以自定義對話框了
五:使用savedInstanceState保存數(shù)據(jù)
- 重寫onSaveInstanceState方法
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
- 在oncerate方法中取出數(shù)據(jù)
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, tempData);
}
六:活動的啟動模式(可以在AndroidManifest.xml中通過給標簽指定android:launchMode屬性來選擇啟動模式)###
- standard:每次啟動創(chuàng)建一個實例(系統(tǒng)默認)
- singleTop:當活動的啟動模式指定為singleTop,在啟動活動時如果發(fā)現(xiàn)返回棧的棧頂已經(jīng)是該活動嫉鲸,則認為可以直接使用它撑蒜,不會再創(chuàng)建新的活動實例
- singleTask:只能存在一個實例。除非銷毀玄渗,否則不新建(可用于防止連續(xù)點擊時重復創(chuàng)建實例)
- singleInstance:在單獨一個返回棧中管理活動座菠,不管哪個應用訪問該活動,都共用一個返回棧
七:一次銷毀多個活動
- 新建ActivityCollector類來管理所有Activity
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中的代碼藤树,
在onceate方法中調(diào)用addactivity
在ondestory方法調(diào)用removeActivity在需要finish所有activity時只要調(diào)用ActivityCollector.finishAll();即可浴滴。
八:啟動活動的最佳寫法(防止調(diào)用時遺漏參數(shù))
- 在activity中新建如下方法
public static void actionStart(Context context, String data1, String data2) {
Intent intent = new Intent(context, SecondActivity.class);
intent.putExtra("param1", data1);
intent.putExtra("param2", data2);
context.startActivity(intent);
} - 調(diào)用時:SecondActivity.actionStart(FirstActivity.this, "data1", "data2");