Android學習筆記(1)

myxs發表於2017-03-23

Android系統四大元件:
活動(Activity):用於顯示各種內容的一個介面
服務(Service):用於後臺執行任務
廣播接收器(Broadcast Receiver):規定應用程式所能接收的廣播和向外傳送廣播
內容提供器(Content Provider):用於應用程式間共享資料

四大元件需要在AndroidManifest.xml裡註冊,如Acitivity的註冊

<activity android:name=".XXXActivity">
        <intent-filter>
                   <action android:name="android.intent.action.MAIN" /><--專案的主活動-->
                  <catepory android:name="android.intent.category.LANCHER" /><--程式啟動後進入的活動-->
         </intent-filter>
</activity>

Android的設計是邏輯和檢視分離,即Activity中不直接寫介面,而是在佈局檔案中,然後在活動中引入佈局檔案(setContentView(R.layout.xxx))
一般一個活動對應一個佈局檔案,建立新活動時會自動建立對應的佈局檔案,也會重寫onCreate方法。
獲取佈局檔案中的各種控制元件例項,findViewById(R.id.xxx),如

Button button = (Button) findViewById(R.id.button)

在活動中使用Menu
res目錄下新建menu資料夾,再新建menu檔案,如main.xml,包括2個選單項

<menu xmlns:android:="http://scemas.android.com/apk/res/android">
    <item
            android:id="@+id/add_item"
            android:title="Add" />
   <item
            android:id="@+id/remove_item"
            android:title="Remove" />
</menu>

在活動中重寫onCreateOptionsMenu方法

public boolean onCreateOptionsMenu(Menu menu){
      getMenuInflater().inflate(R.menu.main, menu);//先得到MenuInflater物件,再呼叫inflate方法給當前活動通過選單資原始檔建立指定選單
      return true;//true 允許建立的選單顯示; false不允許顯示
}

給各選單項新增功能,如點選後彈出訊息,需要定義選單響應事件

public boolean onOptionsItemSelected(MenuItem item){
       switch (item.getItemId() {
       case R.id.add_item:
            Toast.make(this, "Click Add MenuItem", Toast.LENGTH_SHORT).show();
            break;
       ......
       }
       return true;
 }

活動可以通過finish方法銷燬

活動之間的跳轉:Intent Intent可以在不同活動中跳轉,還可以攜帶資料。Intent可用於啟動活動,啟動服務,傳送廣播等
顯示Intent:Intent (Context packageContext, Class<?> cls) 啟動活動的context和目標活動的Class物件

    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    startActivity(intent);

隱式Intent:Intent ("com.example.activitytest.ACTION_START") 啟動某個活動,且標籤指定的就是 Intent中的action引數

<activity android:name=".SecondActivity">
        <intent-filter>
            <action android:name="com.example.activitytest.ACTION_START" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

在FirstActivity中新增如下程式碼,啟動SecondActivity

Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);

當category不是預設的時候,需要給 intent也指定與SecondActivity中的category相同的category

<category android:name="com.example.activitytest.MY_CATEGORY" />

自定義的category。即只有action和category同時匹配的時候,那個活動才能響應intent

Intent intent = new Intent("com.example.activitytest.ACTION_START");    
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);

隱式Intent不僅可以啟動程式內部的活動,還可以啟動其它程式的活動,如啟動系統瀏覽器

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);

撥號介面

Intent intent = new Intent(Intetnt.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);

aciont是Inent.ACTION_VIEW和Inent.ACTION_DIAL,系統內建的動作,再將一個字串解析為Uri物件,並傳遞給intent。 當一個活動配置了標籤,在intent.setData時也必須有指定的引數. 向下一個活動傳遞資料 給Intent物件傳遞簡單型別資料,如String、Boolean、Int等,呼叫Intent物件的putExtra方法,如下程式碼示例

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("string_data","accfcx");
startActivity(intent);

在另一個活動中取出資料

Intent intent = getIntent();
String data = intent.getStringExtra("string_data");

將資料傳給傳給上一個活動 FirstActivity中,新增程式碼如下,其中1是請求碼

ntent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent,1);

SecondActivity中,建立一個Intent物件,攜帶資料,然後會在FirstAcitivity中獲得,程式碼如下

Intent intent = new Intent();
intent.putExtra("data_return","來自SecondActivity的資料");
setResult(RESULT_OK, intent);
finish();

SecondActivity銷燬後(如點選了按鈕或者按下Back鍵),會回撥FirstActivity中的onActivityResult方法,重寫此方法。當按下Back鍵,需要重寫SecondActivity的onBackPressed方法並新增如下程式碼

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case 1:
            if (resultCode == RESULT_OK){
                String returnData = data.getStringExtra("data_return");
            }
            break;
        default:
    }
}

請求碼是用來區別啟動的不同活動,當此方法被呼叫時,檢查請求碼是來自哪一個活動,即每啟動一個活動都分配一個唯一的請求碼

活動的生命週期
onCreate:活動第一次被建立的時候呼叫
onStart:在活動由不可見到可見的時候呼叫
onResume:在恢復或者啟動一個活動時呼叫
onPause:啟動或者恢復另一個活動時呼叫,如啟動了一個對話方塊
onStop:活動完全不可見時呼叫,如啟動了一個新活動
onDestroy:活動銷燬前呼叫
onRestart:活動由停止狀態變為執行狀態前呼叫

當前活動C分別啟動了2個活動,一個普通的活動N,另一個是對話方塊活動D。
程式啟動後,依次呼叫 onCreate、onStart、onResume
此時啟動普通活動N,C呼叫onPause和onStop方法,再回到C時,又會呼叫onRestart、onStart、onResume方法
再啟動對話方塊活動D,C呼叫onPause方法,回到C時,呼叫onResume方法
退出C時,呼叫onPause、onStop、onDestroy方法

活動被回收時,會呼叫onSaveInstanceState方法,可以用來儲存臨時資料,在onCreate中取出儲存的資料

活動的啟動模式
活動有4種啟動模式,standard、singleTop、singleTask和singleInstance standard:每啟動一個活動,都會在返回棧中入棧,不管是否已經存在 singleTop:當已經處於棧頂時,再啟動相同活動,都不會入棧 singleTask:保證整個棧只存在唯一一個活動例項,即使不在棧頂,則把此活動之上的所有活動出棧 singleInstance:啟用新的返回棧管理活動,可以實現和其它程式共享此活動

使用一個BaseActivity和ActivityCollector實現對所有的活動進行管理

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActivityCollector.addActivity(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    ActivityCollector.removeActivity(this);
}

}

 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){
            if (!activity.isFinishing())
                activity.finish();
        }
    }
}

在每一個新建立的活動都繼承BaseActivity類,會自動新增到ActivityCollector中,也能夠呼叫它的的finishAll方法銷燬所有活動
一個啟動活動的技巧,在第一個活動中呼叫要啟動的活動的靜態方法,把資料傳遞進去。方法內部會建立intent物件並啟動活動

相關文章