Android四大元件之BroadcastReceiver
1. 概述
BroadcastReceiver,中文翻譯為“廣播接收器“,要了解廣播接收器的定義,先介紹一下Broadcast(廣播)的含義:
Broadcast:廣播
它是實現不同(應用)程式或者是同一個應用程式內部進行訊息傳遞的一種機制,它的功能定義與Intent非常相似,因為它就是通過Intent物件來裝載資訊的,底層用Binder實現,可以看作是IPC方式的一種。BroadcastReceiver:廣播接收器
它可以對傳送的廣播進行過濾接受並響應的一類元件,可以用來接收(Android操作)系統的廣播或應用的廣播。它就像一個系統層面的全域性監聽器,專門負責監聽各個程式發出的廣播,它可以在所註冊的應用未開啟的情況下,依然會繼續執行。
參考場景:
電臺:傳送廣播 –> 收音機:可以切換到不同頻率接收廣播。
2. 應用場景
系統廣播:
- 手機開機後會傳送一條廣播,在應用中可以接收該廣播來啟動應用。
- 網路狀態變化時,系統會發送一條廣播,應用接收該廣播後,對當前的資料做儲存。
- 當電池電池過低時,系統會發送一條廣播,可以接收該廣播告訴使用者當前電量。
- 接收手機簡訊時,系統會以廣播形式傳送,應用可以擷取該簡訊。
應用廣播
- 在一個活動和一個啟動服務之間,可以間接的通過廣播來實現資訊的互動,解決啟動服務不能向活動返回資訊的問題。
- 如定義中所描述的,可以利用廣播全域性性的特點實現資訊傳遞,具體根據實際的情況來使用。
3. 使用方式
傳送廣播
建立一個(隱式)Intent物件,通過設定該物件屬性來裝載資訊(屬性:action、category、data、extra),如:
Intent intent = new Intent(“com.example.broadcastreceiverdemo.MY_BROADCAST”);通過呼叫相應的方法將Intent物件以廣播形式傳送出去,如:
Context.sendBroadcast(Intent intent);
Context.sendOrderBroadcast(Intent intent);
接收廣播
建立一個廣播接收器:與自定義其它元件(如Activity、Service)類似,你需要繼承BroadcastReceiver類,並複寫onReceive()方法。
註冊廣播接收器:分為靜態註冊和動態註冊,
靜態註冊:在AndroidManifest.xml中appplication 標籤下新增 receiver 子標籤,通過android:name來指定接收器類名,並在該標籤下新增 intent-filter 標籤來設定intent過濾條件;
動態註冊:在程式碼中通過Context.registerReceiver(BroadcastReceiver receiver,IntentFilter filter)方法來註冊,通過Context.unregisterReceiver(BroadcastReceiver receiver)來登出。
動態註冊優點:根據應用的生命週期來決定接收器是否執行,可以降低系統不必要的消耗,如在Activity.onResume()的實現裡註冊接收者的話,你應該在Activity.onPause()裡反註冊它,在paused狀態時你不會接收到intent。
- 接收廣播原理:當通過sendBroadcast(Intent intent)傳送Intent物件後,系統中所有已註冊的BroadcastReceiver都會檢查註冊時的IntentFilter是否與傳送的Intent相匹配,若匹配,則會呼叫BroadcastReceiver的onReceive()方法。
4. 程式碼示例
1.新建一個專案為broadcastreceiverdemo,然後建立一個廣播接收器MyBroadcastReceiver,程式碼如下:
package com.example.broadcastreceiverdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Received a broadcast in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
}
}
2.(靜態)註冊廣播接收器,AndroidManifest.xml程式碼如下:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
...
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.example.broadcastreceiverdemo.MY_BROADCAST"/>
</intent-filter>
</receiver>
</application>
3.傳送廣播。
activity_main.xml中新增一個按鈕用來發送廣播,程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/send_broadcast"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Broadcast" />
</LinearLayout>
在MainActivity中為按鈕註冊點選事件,傳送一個廣播,程式碼示例如下:
package com.example.broadcastreceiverdemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mBtnSendBc = (Button) findViewById(R.id.send_broadcast);
mBtnSendBc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//建立Intent物件並通過建構函式或者setAction()指定action的值
Intent intent = new Intent("com.example.broadcastreceiverdemo.MY_BROADCAST");
/*Intent intent = new Intent();
intent.setAction("com.example.broadcastreceiverdemo.MY_BROADCAST");*/
sendBroadcast(intent);
}
});
}
}
執行程式,點選Send Broadcast按鈕,結果如下:
不同應用間的廣播傳遞
上面的程式碼示例是在一個應用中通過廣播機制來實現訊息的傳遞,下面測試一下不同應用下廣播的傳遞,首先我們再建立一個新的專案為”broadcastreveiverdemo2“,並在該專案中建立一個廣播接收器為”MyBroadcastReceiver2“,程式碼如下:
public class MyBroadcastReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Received a broadcast in MyBroadcastReceiver2",Toast.LENGTH_SHORT).show();
}
}
注意:Toast通知中資訊是”Received a broadcast in MyBroadcastReceiver2“。
在AndroidManifest.xml中註冊該廣播接收器,程式碼如下:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
...
<receiver android:name=".MyBroadcastReceiver2">
<intent-filter>
<action android:name="com.example.broadcastreceiverdemo.MY_BROADCAST"/>
</intent-filter>
</receiver>
</application>
intent-filter中action值同樣為”com.example.broadcastreceiverdemo.MY_BROADCAST“,然後執行該程式,程式安裝成功以後,在手機或模擬器中關閉該應用程序。
注意:直接退出應用是不會關閉應用程序的(系統為了下次更快進入程式),可以在退出應用的前提下,再去Screen Overview來關閉最新開啟的應用程序。
然後,再次進入第一次安裝的應用”broadcastreveiverdemo“中,點選”Send Broadcast“按鈕,介面中會先後彈出”Received a broadcast in MyBroadcastReceiver“和”Received a broadcast in MyBroadcastReceiver2“,截圖如下:
因為Toast通知屬於系統功能,所以應用”broadcastreveiverdemo2“顯示的通知在應用”broadcastreveiverdemo“介面中也可以看到,這也說明應用”broadcastreveiverdemo2“也收到了廣播,驗證了(靜態註冊的)廣播接收器的執行並不依賴當前應用的程序是否在執行,只要手機處於開機狀態,那麼該廣播接收器就會一直接收並過濾廣播資訊。
那麼如果實際應用中並不需要這樣,比如同一個應用不同元件之間,如Activity或Service只有在存活期間才需要接收廣播並響應,怎麼處理,這就需要動態註冊,動態註冊的方式在上面”3.使用方式“第二條有介紹,這裡把專案”broadcastreveiverdemo2“中接收器”MyBroadcastReceiver2“改為動態註冊,首先刪除AndroidManifest.xml中註冊程式碼,然後在MainActivity中新增動態註冊的程式碼,示例如下:
public class MainActivity extends Activity {
private MyBroadcastReceiver2 mReceiver;
private IntentFilter mFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//建立廣播接收器物件
mReceiver = new MyBroadcastReceiver2();
//建立IntentFilter物件,並通過建構函式指定action為com.exampe.broadcastreceiverdemo.MY_BROADCAST
mFilter = new IntentFilter("com.example.broadcastreceiverdemo.MY_BROADCAST");
//通過Context.registerReceiver(BroadcastReceiver receiver,IntentFilter filter)來註冊接收器
registerReceiver(mReceiver, mFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//通過Context.unregisterReceiver(BroadcastReceiver receiver)來登出廣播接收器
unregisterReceiver(mReceiver);
}
}
重新執行程式,開啟應用”broadcastreveiverdemo2“,按Home鍵回到桌面,然後開啟應用”broadcastreveiverdemo“,點選Send Broadcast按鈕,介面中會先後彈出”Received a broadcast in MyBroadcastReceiver“和”Received a broadcast in MyBroadcastReceiver2“;而如果再回到應用”broadcastreveiverdemo2“,並通過Back鍵退出應用,然後再開啟應用”broadcastreveiverdemo“,點選Send Broadcast按鈕,介面中只會彈出”Received a broadcast in MyBroadcastReceiver“,因為應用”broadcastreveiverdemo2“關閉時,在onDestroy()中登出了接收器,所以它無法執行並接收廣播。
系統廣播
開機自動執行的service,程式碼示例:
public class LaunchReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Intent mIntent = new Intent(context,LaunchService.class);
context.startService(mIntent);
}
}
在Androidmanifest.xml中註冊程式碼如下:
<receiver android:name=".MyBroadcastReceiver2">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
手機開機後,將發出一個廣播,它所傳遞Intent物件的action值為”android.intent.action.BOOT_COMPLETED“。
至於LaunchService可以是使用者任意開發的Service,既可以是監聽使用者來電的Service,也可以是監聽使用者簡訊,攔截黑名單的電話等Service,此處不再給出Service的程式碼。
5、廣播型別
Normal Broadcast(普通廣播)
- 廣播傳遞是非同步的,可以在同一時刻(邏輯上)被所有接收器接收,訊息的傳遞比較高效。
- 接收器不能將處理結果傳遞下一個接收器,並且無法使用abortBroadcast()來終止廣播傳遞。
備註:通過Context.sendBroadcast(Intent intent)來發送的廣播就是普通廣播。
Ordered Broadcast(有序廣播)
- 系統根據廣播接收器宣告的優先順序高低(靜態註冊:在AndroidManifest.xml中通過標籤intent-filter的android:priority屬性或動態註冊:通過IntentFilter的物件的setPriority()來設定,值為-1000到1000),從高到低依次傳遞。
- 優先接收到廣播的接收器可以通過abortBroadcast()來終止廣播的傳遞,這樣後面的廣播接收器將無法接收到該廣播;另外可以通過setResultExtras(Bundle bundle)來將處理結果存入廣播,下一個廣播接收器可以通過Bundle getResultExtras(true)來獲取上一個接收器存入的資料。
備註:通過Context. sendOrderedBroadcast (Intent intent, String receiverPermission)來發送的廣播就是有序廣播。
下面就通過程式碼來逐一驗證有序廣播的特性,首先是按優先順序高低,從高到低傳送,利用上面的程式碼,首先修改專案”broadcastreceiverdemo“中AndroidManifest.xml檔案下MyBroadcastReceiver接收器的intent-fliter標籤,通過android:priority設定廣播接收器的優先順序為100,程式碼示例如下:
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter android:priority="100">
<action android:name="com.example.broadcastreceiverdemo.MY_BROADCAST"/>
</intent-filter>
</receiver>
然後把MainActivity中傳送的廣播的語法該為”sendOrderBroadcast()“,程式碼示例如下:
Intent intent = new Intent("com.example.broadcastreceiverdemo.MY_BROADCAST");
/*
* 第二引數為許可權描述,為一個字串型別,即指應用如果要接收該廣播,
* 必須在AndroidManifest.xml中通過use-permission標籤來宣告,這裡為null.
*/
sendOrderedBroadcast(intent,null);
最後進入專案”broadcastreceiverdemo2“,在ManiActivity檔案中通過IntentFilter.setPriority()來設定接收器的優先順序為200,程式碼示例如下:
mReceiver = new MyBroadcastReceiver2();
mFilter = new IntentFilter("com.example.broadcastreceiverdemo.MY_BROADCAST");
mFilter.setPriority(200);
registerReceiver(mReceiver, mFilter);
然後按照上面的操作步驟來檢查點選”Send Broadcast“按鈕後,是否先彈出”Received a broadcast in MyBroadcastReceiver2“,然後在彈出”Received a broadcast in MyBroadcastReceiver“,這部分截圖就不貼上來了,因為不直觀,也可以通過列印日誌的方式來檢視。
接著要測試有序廣播是否可以終止廣播的傳遞,只需要在專案”broadcastreceiverdemo2“中MyBroadcastReceiver2.class檔案下onReceive()方法中新增一行abortBroadcast(),程式碼示例如下:
public class MyBroadcastReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Received a broadcast in MyBroadcastReceiver2",Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
繼續按照上面的操作,檢查頁面是否只彈出”Received a broadcast in MyBroadcastReceiver2“資訊。
最近通過setResultExtras(Bundle)和getResultExtras()來驗證先接收到廣播的接收器是否可以新增資料並傳遞下一個接收器,修改專案”broadcastreveiverdemo2“中MyBroadcastReceiver2.class程式碼如下:
public class MyBroadcastReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Received a broadcast in MyBroadcastReceiver2",Toast.LENGTH_SHORT).show();
// abortBroadcast();
//建立一個Bundle物件
Bundle bundle = new Bundle();
//通過putString方法通過鍵值對方式儲存一個字串值
bundle.putString("msg","This is a message from MyBroadcastReceiver2");
//傳遞給下一個廣播接收器
setResultExtras(bundle);
}
}
修改專案”broadcastreveiverdemo“中MyBroadcastReceiver.class程式碼如下:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//獲取上一個廣播接收器傳遞的Bundle物件
Bundle bundle = getResultExtras(true);
String msg = bundle.getString("msg");
//通過Toast通知顯示出來
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
}
重複上面的操作,檢查Toast是否彈出”This is a message from MyBroadcastReceiver2“,測試截圖如下:
6、安全性。
通過Context.sendBroadcast()傳送的廣播是全域性性的、是跨應用的,那麼你傳送的廣播有可能被別人接取,如果廣播中包含一些機密資訊,會引起安全問題;另外別的應用也有可能向你傳送資訊,那麼有些方式限制著種行為呢:
廣播接收器:
1. 可以通過在manifest中指定元件的屬性android:exported=”false“來防止其它應用傳送廣播給它。
2. 為了在接收的時候執行許可權,你需要在你註冊接收者的時候提供一個非NULL的許可權 – 或者在呼叫registerReceiver(BroadcastReceiver,IntentFilter,String,android.os.Handler)時或者在AndroidManifest.xml靜態標籤。只有獲得許可權允許的廣播(通過在標籤請求)可以傳送Intent給接收者。
傳送廣播:你可以通過以下描述的許可權控制誰可以接收到這些廣播。
1. 從Android 4.0.4開始,你可以使用Intent.setPackage安全地限制廣播到單一的應用。
2. 你要提供一個非NULL的許可權變數給sendBroadcast(Intent,String)或者sendOrderedBroadcast(Intent,String,BroadcastReceiver,android.os.Handler,int,String,Bundle)。只有獲得許可權允許的接收者(通過在AndroidManifest.xml的標籤請求)可以接收到廣播。
可以在Security和Permission官方文件檢視更多關於許可權和安全的資訊。
如果廣播的傳送和接收只在本應用中發生,Android提供了一個本地廣播(LocalBroadcastManager)來進行管理,它可以很好的解決上面的安全問題,它的使用方式很簡單,首先可以通過靜態方法getInstance(Context)獲取它的例項,然後用該例項傳送廣播、註冊廣播接收器、登出廣播接收器來代替Context方法,程式碼如下:
package com.example.broadcastreceiverdemo;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
public static final String MY_BROADCAST = "com.example.broadcastreceiverdemo.MY_BROADCAST";
private LocalBroadcastManager mManager;
private MyBroadcastReceiver mReceiver;
private IntentFilter mFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mManager = LocalBroadcastManager.getInstance(this);
mReceiver = new MyBroadcastReceiver();
mFilter = new IntentFilter(MY_BROADCAST);
mManager.registerReceiver(mReceiver, mFilter);
Button mBtnSendBc = (Button) findViewById(R.id.send_broadcast);
mBtnSendBc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MY_BROADCAST);
mManager.sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
mManager.unregisterReceiver(mReceiver);
}
}
測試結果:專案”broadcastreveiverdemo2“不會接收到廣播。LocalBroadManger需要android.support.v4包,如果無法自動匯入,可以參考這個文章:[Android Studio 權威教程]AS新增第三方庫的6種方式(Jar,module,so等)
本地廣播是無法通過靜態註冊的,因為Androidmanifest.xml是一個全域性性檔案,而靜態註冊的目的就是為了讓程式在未啟動的情況下也能收到廣播,而傳送本地廣播時,程式肯定已經啟動了,因此也不需要靜態註冊的功能。
總結本地廣播的優點:
1. 不會向其它應用傳送廣播,因此不需要擔心機密資料洩露。
2. 其他程式無法向本應用傳送廣播,因此不需要擔心會有安全漏洞的隱患。
3. 因為不需要跨應用傳送,所以執行效率更加高效。
7、生命週期
1、接收器的生命週期
一個廣播接收者只有在onReceive(Context,Intent)方法呼叫時是有效的。一旦你的程式碼從這個函式中返回時,系統就認為這個物件結束了並且不再有效。而onReceive()中不能執行耗時操作,如果操作時間超過10s就出現ANR錯誤。你可以在裡面新增一個無限迴圈並通過列印日誌方式來測試,所以一般廣播接收器的生命週期只有10s。
2、程序的生命週期
你可能想到了,既然onReceive()中不能執行耗時操作,可以開啟一個工作執行緒來執行工作,這也是不允許的,因為接收器物件可能在10s內就銷燬,雖然工作執行緒會繼續執行,但是該程序很可能因為沒有元件在執行變為空程序,比如一個靜態註冊的廣播接收器,接收一個廣播後開啟一個工作執行緒,但接收器物件將很快被銷燬,此時該程序就變為空程序,在記憶體緊張的情況,空程序的優先順序非常低,它會優先被殺掉,那麼裡面所有的子執行緒也會被終止,導致任務執行未結束。而解決辦法,就是通過startService()開啟一個服務,這樣就提高了程序的優先順序,不會被輕易殺掉。
另外,你不能從BroadcastReceiver裡展示一個對話方塊或者繫結Service。對於前者,你應該使用NotificationManager API來代替。對於後者,你可以使用Context.startService()來發送一個命令給Service。其實對話方塊可以通過把型別設定為”TYPE_SYSTEM_ALERT“在廣播接收器中顯示。
相關推薦
Android--四大元件之BroadCastReceiver(生命週期、實現原理及使用等)
####1. BroadCastReceiver是什麼? ####2. 廣播型別 ######1). 有序廣播 ######2). 無序廣播 ####3. 生命週期 ####4. 實現原理 ####5. 使用方法 ####6. 許可權問題(安全性) ####7. LocalBroad
Android四大元件之BroadcastReceiver應用詳解
今天我們來講一下Android中BroadcastReceiver的相關知識。 BroadcastReceiver也就是“廣播接收者”的意思,顧名思義,它就是用來接收來自系統和應用中的廣播。 在Android系統中,廣播體現在方方面面,例如當開機完成後系統會產生一條廣播,接收到這條廣播就能實
Android 四大元件之“ BroadcastReceiver ”
前言 Android四大元件重要性已經不言而喻了,今天談談的是Android中的廣播機制。在我們上學的時候,每個班級的教室裡都會裝有一個喇叭,這些喇叭都是接入到學校的廣播室的,一旦有什麼重要的通知,就會播放一條廣播來告知全校的師生。類似的工作機制其實在計算機領域也有很廣泛的應用,如果你瞭解網路通訊原理應該會知
Android四大元件之BroadcastReceiver
1. 概述 BroadcastReceiver,中文翻譯為“廣播接收器“,要了解廣播接收器的定義,先介紹一下Broadcast(廣播)的含義: Broadcast:廣播 它是實現不同(應用)程式或者是同一個應用程式內部進行訊息傳遞的一種機制,它的功能定義
Android四大元件之BroadcastReceiver(下)
(一)概述 上節我們對BroadcastReceiver已經有了一個初步的瞭解了,知道兩種廣播型別:標準與有序, 動態或靜態註冊廣播接收者,監聽系統廣播,自己傳送廣播!已經滿足我們的基本需求了~ 但是前面寫的廣播都是全域性廣播!這同樣意味著我們APP發出的廣播
Android四大元件之BroadcastReceiver(廣播)
什麼是廣播 廣播是一個全域性的監聽器,屬於Android四大元件之一,它分為兩個角色:廣播發送者、廣播接收者 廣播用於不同元件之間(應用內/不同應用之間),還有多執行緒之間的通訊 - 廣播的
Android四大元件之BroadcastReceiver工作原理
1.廣播的註冊 As we all know,廣播的註冊也是分兩種:動態註冊和靜態註冊,前者是在Activity生命週期中用java程式碼註冊和解除註冊,後者是在AndroidManifest檔案中。後者在安裝時由PKMS解析並註冊的,後續會單獨分析,這裡只分析廣播的動態註
Android四大元件之BroadcastReceiver的使用
工作之餘,有些閒功夫,想想還是總結一下基礎知識,Android廣播在專案中使用還是比較多的,相對於四大元件,可能僅次於Activity的使用。首先,我們得知道廣播的作用:從字面意思上來看,廣播就好比收音機通知收聽者,同時也能攜帶廣播資訊。廣播的種類可分為有序廣播和無需廣播,
Android四大元件之廣播接收者(BroadcastReceiver)
廣播接收者簡介: 為了監聽來自系統或應用程式的廣播事件,Android系統提供了BroadcastReceiver(廣播接收者)元件。 廣播接收者建立: 右擊—-包名—-new—-Other—-Broadcast Receiver—-名字自取、其他預設
android學習筆記之四:四大元件之BroadcastReceiver
1.定義廣播接收者 定義一個類繼承BroadcastReceiver,並重寫onReceive()方法。 @Override public class SMSBroadCastReceiver
Android 四大元件之Service的啟動、繫結小述
一、概述 學習過Android的小夥伴就不可能不知道Service是什麼,因為Service是Android四大元件之一,聲名赫赫有木有,所以在這裡我就不詳細介紹了,本節主要還是充當筆記的作用,因為我待記性如初戀,記性虐我千百遍。 二、Service的建立 Service是一
Android 四大元件之——Service(一)
一、什麼是服務 服務,是Android四大元件之一, 屬於 計算型元件。 長期後臺執行的沒有介面的元件 ,特點是無使用者介面、在後臺執行、生命週期長 二,什麼時候使用服務?  
Android 四大元件之——Acitivity(四) Activity是如何載入顯示內容的?
1. 在Activity呼叫onCreate()等生命週期之前,Activity會呼叫attach()方法,而在attach()方法中會呼叫如下程式碼 onAttach() { PolicyManager.makeNewWindow(this) }而makeNewWindow實際
Android 四大元件之——Acitivity(三) 深入瞭解Activity的啟動流程
上圖為整個Activity的啟動流程 接下來我們大概分析 在我們的Android系統中,應用程式是由Launcher這個應用啟動起來的。當我們安裝好應用程式之後,就會在Launcher的介面上生成一個圖示,我們點選圖示時Launch就會啟動我們的應用程式。 1.點選
Android 四大元件之——Acitivity(二) 啟動模式
Activity的啟動模式共有4種 分別為 standard、singleTop、singleTask、singleInstance ; 四種啟動模式的配置都在Manifest檔案中配置,配置模板為 <activity
Android 四大元件之——Acitivity(一)
一,什麼是Activity activity是Android元件中最基本也是最為常見用的四大元件之一。Android四大元件有Activity,Service服務,Content Provider內容提供,BroadcastReceiver廣播接收器。 Activity中所有操作都與使用
Android--四大元件之Service
####1. Service是什麼? ####2. 啟動方式 ######1). 差異 ######2). 關聯 ####3. 生命週期 ######1). startService ######2). bindService ####4.本地服務與遠端服務 ####5.Intent
Android--四大元件之Activity(一)
####1. Activity是什麼? ####2. 生命週期 ######1). Activity跳轉 ######2). 從後臺啟動 ######3). 橫豎屏切換 ####3. 啟動模式 ######1). 任務棧 ######2). laucherMode ######3).
Android四大元件之ContentProvider(二)
上節提到的四大元件之ContentProvider的簡單使用,在這篇文章中詳細的介紹其中的一些方法。 1.String getType(Uri uri)方法 首先看看官方對它的解釋: /** * Implement this to handle requests
Android四大元件之ContentProvider(一)
1.什麼是ContentProvider? 內容提供程式管理對資料結構化資料集的訪問。它們封裝資料,並提供用於定義資料安全性的機制。內容提供者是連線一個程序中的資料與另一個程序中執行的程式碼的標準介面。 是不同應用程式之間進行資料交換的標準API,以某種Uri的形式對外提供資料,