總結《第一行代碼》Android學習筆記(二)活動Activity
- 活動(Activity)
-
- Toast的使用
- Menu的使用
- 銷毀活動
- 使用Intent實作活動的轉移和資料傳遞
-
- 1.使用顯式Intent
- 2.使用隐式Intent
- 3.隐式Intent的更多用法
- 4.向下一個活動傳遞資料
- 5.向上一個活動傳遞資料
- 活動的生命周期
- 活動的回收後資料丢失問題
- 活動的啟動模式
-
- 1.standard
- 2.singleTop
- 3.singleTask
- 4.singleInstance
- 活動的優化
-
- 1.擷取目前活動名
- 2.随時随地退出程式
- 3.啟動帶參數的活動
活動(Activity)
Toast的使用
Menu的使用
1.res目錄下建立名為main的Menu resource file檔案。
2.在main.xml添加兩個菜單項:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/add_item"
android:title="Add"/>
<item android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
3.在活動中重寫onCreateOptionsMenu()給活動建立菜單:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
4.在活動中重寫onOptionsItemSelected()來定義菜單項的響應事件:
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.add_item:
Toast.makeText(FirstActivity.this,"You clicked add",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this,"You clicked remove",Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
銷毀活動
通過finish()來銷毀目前活動:
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
使用Intent實作活動的轉移和資料傳遞
1.使用顯式Intent
點選button1從FirstActivity轉移到SecondActivity:
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
2.使用隐式Intent
先在androidManifest中為SecondActivity指定活動能夠響應的action和category:
<activity
android:name=".SecondActivity"
android:label="This is SecondActicity">
<intent-filter>
<action android:name="second action"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="second category"/>
</intent-filter>
</activity>
然後修改按鈕點選事件:
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent = new Intent("second action");
intent.addCategory("second category");
startActivity(intent);
}
});
3.隐式Intent的更多用法
(1)調用系統浏覽器并且打開指定網頁:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
(2)調用系統撥号界面并且輸入10086:
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
(3)調用系統谷歌地圖并顯示地理位置:
geo:latitude,longitude
顯示給定經度和緯度處的地圖。
示例:"geo:47.6,-122.3"
geo:latitude,longitude?z=zoom
按特定縮放級别顯示給定經度和緯度處的地圖。縮放級别為 1 時顯示以給定緯度、經度為中心的全球地圖。 最高(最精确)縮放級别為 23。
示例:"geo:47.6,-122.3?z=11"
geo:0,0?q=lat,lng(label)
顯示給定經度和緯度處帶字元串标簽的地圖。
示例:"geo:0,0?q=34.99,-106.61(Treasure)"
geo:0,0?q=my+street+address
顯示“我的街道位址”的位置(可能是具體位址或位置查詢)。
示例:"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
注:geo URI 中傳遞的所有字元串都必須編碼。 例如,字元串 1st & Pike, Seattle 應編碼為 1st%20%26%20Pike%2C%20Seattle。字元串中的空格可使用 %20 編碼或替換為加号 (+)。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("geo:47.6,-122.3"));
startActivity(intent);
4.向下一個活動傳遞資料
在SecondActivity中通過putExtra()将資料儲存在intent中,然後将intent轉移到ThirdActivity中:
String data = "123456";
Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
在ThirdActivity中通過getIntent()擷取啟動ThirdActivity的intent,然後調用getStringExtra()擷取傳遞的資料:
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("ThirdActivity", "onCreate: "+data);
5.向上一個活動傳遞資料
在SecondActivity中點選按鈕跳轉到ThirdActivity:
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
startActivityForResult(intent,1);
}
});
在ThirdActivity中點選按鈕将資料傳遞給SecondActivity:
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return","666");
setResult(RESULT_OK,intent);
finish();
}
});
在SecondActivity中重寫onActivityResult():
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode){
case 1:
if (resultCode==RESULT_OK){
String returnedData = data.getStringExtra("data_return");
Log.d("SecondActivity", "onActivityResult: "+returnedData);
}
}
}
活動的生命周期
活動的四種狀态:運作狀态,暫停狀态,停止狀态和銷毀狀态。
運作狀态onResume():活動處于傳回棧的棧頂時,活動處于運作狀态。
暫停狀态onPause():活動不處于傳回棧的棧頂但仍然可見時,活動處于暫停狀态。
停止狀态onStop():活動不處于傳回棧的棧頂且完全不可見時,活動處于停止狀态。
銷毀狀态onDestory:活動從傳回棧中移除後處于銷毀狀态。
活動的回收後資料丢失問題
因為活動被回收前一定會調用onSaveInstanceState()回調方法,是以重寫onSaveInstanceState()來儲存資料:
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "abc";
outState.putString("data_key",tempData);
}
然後在onCreate()中取出資料:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("MainActivity", "onCreate");
setContentView(R.layout.activity_main);
if(savedInstanceState != null){
String tempData = savedInstanceState.getString("data_key");
Log.d("MainActivity", "tempData");
}
}
活動的啟動模式
活動的啟動模式一共有4種:standard、singleTop、singleTask和singleInstance。
活動的啟動模式可在AndroidManifest.xml中活動中通過修改launchMode來修改:
<activity
android:name=".FirstActivity"
android:label="This is FirstActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHNER" />
</intent-filter>
</activity>
1.standard
standard是活動預設啟動模式,啟動新活動時不會在乎這個活動是否已經在傳回棧中入棧,每次啟動都會建立該活動的一個新的執行個體。
2.singleTop
singleTop在建立活動時會判斷棧頂是否為新的活動,若是新的活動則會建立,若不是新的活動則不會建立。
3.singleTask
singleTask在建立活動時會判斷傳回棧裡是否存在該活動,若不存在則會建立,若存在則出棧該活動上的所有活動。
4.singleInstance
這個啟動模式能使不同的傳回棧公用同一個活動執行個體。例如FirstActivity和ThirdActivity都是standard啟動模式,SecondActi-vity是singleInstance啟動模式,當FirstActivity跳轉到SecondActivity時會建立兩個傳回棧,可使用getTaskID()方法觀察棧的序号,然後SecondActivity跳轉到ThirdActivity,當點Back鍵時直接傳回FirstActivity然後再傳回SecondActivity。
活動的優化
1.擷取目前活動名
建立BaseActivity類然後繼承自AppComatActivity,重寫onCreate()方法:
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());//擷取活動名
}
}
然後将需要啟動的活動繼承自BaseActivity。
2.随時随地退出程式
建立ActivityCollector類:
public class ActivityCollector {
public static List<Activity> 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){
activity.finish();
}
activities.clear();
}
}
修改BaseActivity:
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
調用直接退出程式方法:
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityCollector.finishAll();//結束程式
android.os.Process.killProcess(android.os.Process.myPid());//結束程序
}
});
3.啟動帶參數的活動
在SecondActivity中添加actionStart()方法:
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);
}
FirstActivity跳轉到SecondActivity:
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SecondActivity.actionStart(FirstActivity.this,"sjl","qmt");
}
});