天天看點

安卓學習筆記(二)活動Activity活動(Activity)

總結《第一行代碼》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:活動從傳回棧中移除後處于銷毀狀态。

安卓學習筆記(二)活動Activity活動(Activity)

活動的回收後資料丢失問題

因為活動被回收前一定會調用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是活動預設啟動模式,啟動新活動時不會在乎這個活動是否已經在傳回棧中入棧,每次啟動都會建立該活動的一個新的執行個體。

安卓學習筆記(二)活動Activity活動(Activity)

2.singleTop

singleTop在建立活動時會判斷棧頂是否為新的活動,若是新的活動則會建立,若不是新的活動則不會建立。

安卓學習筆記(二)活動Activity活動(Activity)

3.singleTask

singleTask在建立活動時會判斷傳回棧裡是否存在該活動,若不存在則會建立,若存在則出棧該活動上的所有活動。

安卓學習筆記(二)活動Activity活動(Activity)

4.singleInstance

這個啟動模式能使不同的傳回棧公用同一個活動執行個體。例如FirstActivity和ThirdActivity都是standard啟動模式,SecondActi-vity是singleInstance啟動模式,當FirstActivity跳轉到SecondActivity時會建立兩個傳回棧,可使用getTaskID()方法觀察棧的序号,然後SecondActivity跳轉到ThirdActivity,當點Back鍵時直接傳回FirstActivity然後再傳回SecondActivity。

安卓學習筆記(二)活動Activity活動(Activity)

活動的優化

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");
    }
});
           

繼續閱讀