四大組件
Activity
實作步驟
-
繼承 Activity 或其子類,實作以下方法:
//第一次創建時回呼 protected void onCreate(Bundle savedInstanceState); //啟動時回呼 protected void onStart(); //再次啟動時回呼 protected void onRestart() ; //回到前臺時回呼 protected void onResume(); //轉入后臺但依然可見時回呼 protected void onPause() ; //轉入后臺完全不可見時回呼 protected void onStop(); //被系統銷毀時回呼 protected void onDestroy(); -
在 AndroidMainfest.xml 檔案中配置
-
啟動,有以下兩種方式:
//啟動其他Activity startActivity(Intent intent); //啟動其讓Activity并回傳請求碼 startActivityForResult(Intent intent,int requestCode); -
停止,有以下兩種方式:
//結束當前Activity finish(); //結束當前Activity并回傳狀態碼 finish(Intent intent,int requestCode);
IBindle與Activity之間的通信
IBindle 是一個簡單的資料攜帶包,用于實作 Activity 之間的資料交換,Intent 提供了 putExtras() 和 getExtras() 方法,這些方法實質是存取 Intent 所攜帶的 IBindle 中的資料,
Intent 提供的多個多載方法攜帶額外資料:
//向Intent中存放資料包
putExtras(Bundle data);
//取出Intent中存放的資料包
getExtras(Bundle data);
//向Intent中以k-v形式存放資料包
putExtra(String name,String value);
//根據k取出指定型別的值
getXxxExtra(String name);
Bundle包含的多個方法來存入資料:
//向Bundle中存放資料
putXxx(String key,Xxx data);
//向Bundle中存放一個可序列化物件
putSerialzable(String key,Serialzable data);
生命周期
運行狀態:當前 Activity 位于前臺,用戶可見,可以獲得焦點;
暫停狀態:其他 Activity 位于前臺,該 Activity 依然可見,但無法獲得焦點;
停止狀態:該 Activity 不可見,無法獲得焦點;
銷毀狀態:該 Activity 結束或 Activity 所在行程被結束,
四種加載模式
standard:每次啟動目標 Activity 時,總會為目標 Activity 創建一個新實體,并添加到原有的 Task 中,
singleTop:當將要啟動的目標 Activity 位于 Task 堆疊頂中,系統直接服用已有的 Activity 實體,
singleTask:包括以下三種情況
- 啟動目標 Activity 不存在,創建新實體并加入到 Task 堆疊頂中;
- 啟動目標 Activity 存在且位于 Task 堆疊頂,直接復用已有 Activity 實體;
- 啟動目標 Activity 存在但不在 Task 堆疊頂,將位于目標 Activity 之上的實體移除 Task,
singleInstance:包括以下兩種情況:
- 啟動目標 Activity 不存在,先創建一個 Task,然后創建目標 Activity 實體并添加到 Task 中;
- 啟動目標 Activity 存在,將該 Activity 所在 Task 轉到前臺,使該 Activity 顯示出來,
ContentProvide
ContentProvide 是不同應用程式之間進行交換的標準 API,以某種 Uri 的形式對外提供資料,允許其他應用訪問或修改資料,
實作步驟
-
繼承 ContentProvider,實作以下方法:
//當其他程式第一次訪問該ContentProvider時,該ContentProvider被創建出來并立即回呼onCreate() public boolean onCreate(); //根據Uri查詢selection條件所匹配的全部記錄,projection指的是列名串列,表明只選擇出指定的資料列 public Cursor query(Uri uri, String[] projection,String selection,String[] selectionArgs,String sortOrder); //用于回傳當前Uri所代表的MIME型別 //若Uri對應資料包含多條記錄,該MIME型別字串應以vnd.android.cursor.dir/開頭 //若Uri對應資料包含一條記錄,該MIME型別字串應以vnd.android.cursor.item/開頭 public String getType(Uri uri); //根據Uri插入values對應的資料 public Uri insert(Uri uri, ContentValues values); //根據Uri洗掉selection所匹配的全部記錄 public int delete(Uri uri, String selection,String[] selectionArgs); //根據Uri修改selection條件所匹配的全部記錄 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs); -
向 AndroidMainfest.xml 檔案中注冊該 ContentProvider,并為它系結一個 Uri
Uri類似于互聯網中的URL,URL由協議、域名、網站資源三個部分組成,Uri可以分為以下三部分
- Content://:暴露和訪問ContentProvider的協議默認為content://
- org.crazyit.providers.dictprovider:這部分是ContentProvider的authorities,用于指定要訪問的ContentProvider
- words:資源部分
Uri基本遵循了RESTful風格
ContentResolver
ContentProvider 相當于一個網站,它的作用是暴露可供操作的資料,其他程式則通過 ContentResolve r來操作 ContentProvider 所暴露的資料,ContentResolver 相當于 HttpClient.
Context 提供了以下方法來獲取 ContentResolver 物件:
//獲取應用的默認ContentResolver
getContentResolver();
//向Uri對應的ContentProvider
insert(Uri url,ContentValues values);
//洗掉Uri對應的ContentProvider中where條件匹配資料
delete(Uri url,String where,String[] selectionArgs);
//更新Uri對應的ContentProvider中where條件匹配資料
update(Uri url,String where,String[] selectionArgs);
//查詢Uri對應的ContentProvider中where條件匹配資料
query(Uri url,String[] projection,String selection,String[] selectionArgs,String sortOrder)
ContentProvider 一般為單實體模式,多個程式通過 ContentResolver 操作 ContentProvider 提供資料時,會委托給同一個 ContentProvider
Uri 引數判斷
為了確定 ContentProvider 能夠處理 Uri,以及確定每個方法中 Uri 引數所操作的資料, Android 提供了 UriMatch、ContentUris 工具類,
UriMatcher 工具類
//向UriMatcher物件注冊Uri
void addURL(String authority,String path,int code);
//根據前面注冊的Uri來判斷Uri對應的標識,若無法匹配則回傳-1
int match(Uri uri);
ContentUris 工具類
//用于為路徑添加ID部分
withAppendId(Uri contentUri, long id)
//用于指定Uri中決議出包含ID值
parseId(Uri contentUri);
系統的ContentProvider
| Uri | 說明 |
|---|---|
| ContactsContract.Contacts.CONTENT_URL | 管理聯系人的Uri |
| ContactsContract.CommonDataKinds.Phone.CONTENT_URL | 管理聯系人電話的Uri |
| ContactsContract.CommonDataKinds.Email.CONTENT_URL | 管理聯系人E-mail的Uri |
| MediaStore.Audio.Media.EXTERNAL_CONTENT_URL | 存盤在手機外部存盤器上的音頻檔案內容的Uri |
| MediaStore.Audio.Media.INTERNAL_CONTENT_URL | 存盤在手機內部存盤器上的音頻檔案內容的Uri |
| MediaStore.Images.Media.EXTERNAL_CONTENT_URL | 存盤在手機外部存盤器上的圖片檔案內容的Uri |
| MediaStore.Video.Media.INTERNAL_CONTENT_URL | 存盤在手機內部存盤器上的視頻檔案內容的Uri |
| MediaStore.Video.Media.EXTERNAL_CONTENT_URL | 存盤在手機外部存盤器上的視頻檔案內容的Uri |
Service
實作步驟
-
繼承 Service 重寫回呼方法
-
在 Androidmainfest.xml 檔案中配置該 Service
-
運行 Service,包括以下兩種方法:
- Context 的 startService() 方法,該方法啟動 Service 與啟動者不建立連接關系,啟動者退出 Service 保持運行,
- Centext 的 bindService() 方法,該方法啟動 Service 與啟動者系結在一起,啟動者退出 Service 也退出,
//創建啟動Service的Intent Intent intent = new Intent(this, MusicService.class); //啟動后臺 startService(intent); //關閉后臺 stopService(intent);
創建顯式 Intents :
- 通過 Context、目標 Service 類創建顯式 Intent
- 通過package、action 屬性創建顯式 Intent
系結本地 Service 并與之通信
當 Service 與訪問者 需要進行方法呼叫或交換資料時,應使用 bindService() 和 unbindService() 啟動和關閉 Service,
/**
* Service: 通過Intent指定需要啟動的Service
* Conn: 用于監聽訪問者與Service之間的連接情況.
* 訪問者與Service連接成功時將回呼該ServiceConnection的onServiceConnected(ComponentName name,IBinder service)方法
* 訪問者與Service連接例外時將回呼該ServiceConnection的onServiceDisconnected(ComponentName name,IBinder service)方法
* flags: 系結時是否自動創建Service,引數可為0(不自動創建)或BIND_AUTO_CREATE(自動創建)
* */
public boolean bindService(Intent service, ServiceConnection conn,int flags);
ServiceConnection 物件的 onServiceConnected(ComponentName name,IBinder service) 有一個 IBind(Intent intent) 物件,該物件可實作與系結 Service 之間的通信,
開發 Service 類時,該 Service 類必須提供一個 IBinder onBind(Intent intent) 方法,實際開發時通常會采用繼承 Binder 的方式實作 IBinder 物件,
生命周期
public class MusicService extends Service {
//被創建時回呼
@Override
public void onCreate() {
super.onCreate();
}
//被系結時回呼
@Override
public IBinder onBind(Intent intent) {
return null;
}
//被啟動時回呼
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
//被取消系結時回呼
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
//被停止時回呼
@Override
public void onDestroy() {
super.onDestroy();
}
}
IntentService
Service 與它所在的應用位于同一行程中,因此不應該在 Service 中直接處理耗時操作,
IntentService 具有如下特征:
- IntentService 會創建獨立執行緒處理 onHandleIntent() 方法實作的代碼,開發者無需處理多執行緒問題,
- 當所有請求處理完成后,IntentService 會自動停止,因此無需呼叫 stopSelf() 方法來停止 Service,
- 為 Service 的 onBind() 方法提供了默認實作,默認回傳為null.
- 為 Service 的 onStartCommand() 方法提供了默認實作,該實作會自動將請求 Intent 加入佇列中,
在使用擴展 IntentService 實作 Service 無須重寫 onBind()、onStartCommand() 方法,只要重寫 onHandleIntent() 方法即可,
BroadcastReceiver
broadcastReceiver 本質上是一個全域監聽器,用于監聽系統全域的廣播訊息,
啟動步驟
-
創建需啟動的 BroadcastReceiver 的 Intent
-
呼叫 Context 的 sendBroadcast() 或 sendOrderBroadcast() 方法啟動指定的 BroadcastReceiver
//創建Intent Intent intent = new Intent(); //設定action屬性 intent.setAction("org.crazyit.action.CRAZY_BROADCAST"); intent.setPackage("org.crazyit.broadcast"); intent.putExtra("msg","簡單的訊息"); //發送廣播 sendBroadcast(intent);
實作方式
-
繼承 BroadcastReceiver 重寫 onReceive(Context context, Intent inten) 方法
-
指定該 BroadcastReceiver 能匹配的 Intent,有以下兩種方式:
- 代碼中使用 BroadcastReceiver 的 Context 的 registerReceiver(BroadcastReceiver receiver,IntentFilter filter)
IntentFilter filter = new IntentFilter("android.provider.Telephoy.SMS_RECEIVED"); IncomingSMSReceiver receiver = new IncomingSMSReceiver(); registerReceiver(receiver ,filter);- 在 AndroidMainfest.xml 檔案中配置
<receiver android:name=".IncomingSMSReceiver"> <intent-filter> <action android:name = "android.provider.Telephony.SMS_RECEIVERD"/> </intent-filter> </receiver>在實踐程序中,發現 Receiver 只有放在專案主目錄下才能被讀取注冊
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/500475.html
標籤:Android
上一篇:移動web布局方法
