摘要:靜態注冊廣播的方法動態注冊廣播在中動態注冊廣播,通常格式如下動態注冊廣播動態注冊監聽滅屏點亮屏幕的廣播在廣播中動態注冊廣播請注意一定要使用,防止為空,引起空指針異常。綁定模式此模式通過綁定組件等調用啟動此服務隨綁定組件的消亡而解除綁定。
極力推薦文章:歡迎收藏
Android 干貨分享
本篇文章主要介紹 Android 開發中的部分知識點,通過閱讀本篇文章,您將收獲以下內容:
廣播的生命周期
四大組件之一,必須在Androidmainfest.xml中注冊
廣播的注冊(靜態廣播、動態廣播)
廣播的發送(正常、有序、持續)
廣播接收(系統廣播、自定義廣播)
Broadcast 是 Android 四大組件之一,是一種廣泛運用在應用程序之間異步傳輸信息的機制。
Broadcast 本質上是一個Intent 對象,差別在于 Broadcast 可以被多個 BroadcastReceiver 處理。BroadcastReceiver 是一個全局監聽器,通過它的 onReceive() 可以過濾用戶想要的廣播,進而進行其它操作。
BroadcastReceiver 默認是在主線程中執行,如果onReceiver() 方法處理事件超過10s,則應用將會發生ANR(Application Not Responding),此時,如果建立工作線程并不能解決此問題,因此建議:如處理耗時操作,請用 Service 代替。
BroadcastReceiver繼承關系 如下:
java.lang.Object ? android.content.BroadcastReceiver
BroadcastReceiver 的主要聲明周期方法onReceiver(),此方法執行完之后,BroadcastReceiver 實例將被銷毀。
2.四大組件之一,必須在Androidmainfest.xml中注冊注意:
如不注冊,將導致無法接收處理廣播消息
廣播的注冊分兩種,一種在ndroidMfest.xml中靜態注冊,另一種是在Java代碼中動態注冊。
1.靜態注冊一些系統發送的廣播需要在Androidmainfest.xml 中靜態注冊,例如 開機廣播,apk狀態改變廣播,電量狀態改變廣播等。這些靜態注冊的廣播,通常在Androidmainfest.xml 中攔截特定的字符串。
靜態注冊廣播的方法如下:
1.靜態注冊開機廣播方法... ... ... ...
開機廣播比較特殊,需要在Androidmainfest.xml 中添加權限。否則,無法獲取開機廣播。
2.動態注冊廣播//靜態注冊廣播的方法
在Java中動態注冊廣播,通常格式如下:
//動態注冊廣播 registerReceiver(BroadcastReceiver, IntentFilter);動態注冊 監聽滅屏、點亮屏幕的廣播
在廣播中動態注冊廣播請注意一定要使用context.getApplicationContext(),防止context 為空 ,引起空指針異常。
public class ScreenOnOffReceiver { public static void ReceiverScreenOnOff(Context context) { IntentFilter screenOffFilter = new IntentFilter(); screenOffFilter.addAction(Intent.ACTION_SCREEN_OFF); screenOffFilter.addAction(Intent.ACTION_SCREEN_ON); BroadcastReceiver mScreenOnOffReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if (action.equals(Intent.ACTION_SCREEN_OFF)) { Toast.makeText(context, "接收屏幕熄滅廣播", Toast.LENGTH_SHORT).show(); } if (action.equals(Intent.ACTION_SCREEN_ON)) { Toast.makeText(context, "接收屏幕點亮廣播", Toast.LENGTH_SHORT).show(); } } }; /** * context.getApplicationContext() * 在廣播中注冊廣播時候需要注意,防止context 為空 ,引起空指針異常 * **/ // 2.動態注冊廣播的方法 context.registerReceiver(mScreenOnOffReceiver, screenOffFilter); } }4.廣播的發送(無序、有序、持續) 1.發送無序廣播的方法
發送無序廣播在Android 中很常見,是一種一對多的關系,主要通過 sendBroadcast(intent);發送廣播。
發送自定義廣播案例廣播說白了就是一個帶Action等字符串標記的Intent。發送自定義廣播舉例如下:
Intent customIntent=new Intent(); customIntent.setAction("SendCustomBroadcast"); sendBroadcast(customIntent);接收自定義廣播的方法
當用戶對某些廣播感興趣的話,此時可以獲取此廣播,然后在onReceive方法中處理接收廣播的一下操作。
public class CustomBroadcast extends BroadcastReceiver { public CustomBroadcast() { } @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("SendCustomBroadcast")){ Toast.makeText(context,"自定義廣播接收成功:Action:SendCustomBroadcast",Toast.LENGTH_SHORT).show(); } } }
注意自定義廣播是在Androidmanfest.xml 中靜態注冊的。2.發送有序廣播
廣播在Android是有優先級的,優先級高的廣播可以終止或修改廣播內容。發送有序廣播的方法如下sendOrderedBroadcast(intent,"str_receiver_permission");
例如:發送自定義有序廣播Intent customOrderIntent=new Intent(); customOrderIntent.setAction("SendCustomOrderBroadcast"); customOrderIntent.putExtra("str_order_broadcast","老板說:公司每人發 10 個 月餅"); sendOrderedBroadcast(customOrderIntent,"android.permission.ORDERBROADCAST");
廣播屬于四大組件,一定要在AndroidMainfest.xml 中注冊。
有序廣播靜態注冊接收有序廣播的靜態注冊方法如下:
有序廣播,高優先級廣播可以優先處理
public class CustomHightBrodcast extends BroadcastReceiver { public CustomHightBrodcast() { } @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("SendCustomOrderBroadcast")) { Toast.makeText(context, intent.getStringExtra("str_order_broadcast"), Toast.LENGTH_SHORT).show(); Bundle bundle=new Bundle(); bundle.putString("str_order_broadcast","經理說:公司每人發 5 個 月餅"); // 修改廣播傳輸數據 setResultExtras(bundle); } } }
中優先級的廣播后序處理
public class CustomMiddleBroadcast extends BroadcastReceiver { public CustomMiddleBroadcast() { } @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("SendCustomOrderBroadcast")) { Toast.makeText(context, getResultExtras(true).getString("str_order_broadcast"), Toast.LENGTH_SHORT).show(); Bundle bundle=new Bundle(); bundle.putString("str_order_broadcast","主管說:公司每人發 2 個 月餅"); setResultExtras(bundle); } } }
低優先級廣播最后處理
public class CustomLowerBroadcast extends BroadcastReceiver { public CustomLowerBroadcast() { } @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("SendCustomOrderBroadcast")) { String notice= getResultExtras(true).getString("str_order_broadcast"); Toast.makeText(context,notice, Toast.LENGTH_SHORT).show(); // 終止廣播繼續傳播下去 abortBroadcast(); } } }
注意 :
有序廣播需要聲明并使用權限
1.聲明使用權限
android:name="android.permission.ORDERBROADCAST" />
2.聲明權限
android:name="android.permission.ORDERBROADCAST"/>
在有序廣播中高優先級的廣播接收廣播,可以修改數據,然后傳給低優先級的廣播。
3.發送持續廣播(已經被棄用)粘性廣播會在Android 系統中一直存在,不過隨著 Android系統的不斷更新,此方法逐漸被拋棄,使用方法如下:sendStickyBroadcast(intent);
5.廣播接收(系統廣播、自定義廣播)當廣播發出后,如何接收廣播呢,下面將介紹接收廣播的方法。
接受廣播類 主要繼承 BroadcastReceiver,然后在onReceive方法,過濾廣播Action中攜帶的Intent,然后進行相關處理。
p ublic class BootReceiverMethod extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 接收開機廣播處理事情,比如啟動服務 Intent mStartIntent = new Intent(context, StartServiceMethods.class); context.startService(mStartIntent); } }2.在Androidmainfest.xml 聲明組件信息,并過濾開機完成 Action
3.聲明接收開機廣播完成的權限
極力推薦文章:歡迎收藏
Android 干貨分享
本篇文章主要介紹 Android 開發中的部分知識點,通過閱讀本篇文章,您將收獲以下內容:
Service 簡介
四大組件之一,必須在Androidmainfest.xml 中注冊
啟動模式啟動服務
綁定模式綁定服務
前臺服務
AIDL遠程服務
Service 是 Android 四大組件之一(Activity 活動,Service 服務,ContentProvider 內容提供者,BroadcastReceiver 廣播),與Activity相比,Activity 是運行在前臺,用戶可以看得見,Service 則是運行在后臺,無用戶界面,用戶無法看到。
Service主要用于組件之間交互(例如:與Activity、ContentProvider、BroadcastReceiver進行交互)、后臺執行耗時操作等(例如下載文件,播放音樂等,但Service在主線程運行時長不能超過20s,否則會出現ANR,耗時操作一般建議在子線程中進行操作)。
1.Service 簡介在了解Service 的生命周期的之前,我們先了解一下Service 的繼承關系,方便我們更好的了解Service。
Service 繼承關系如下:java.lang.Object ? android.content.Context ? android.content.ContextWrapper ? android.app.ServiceService 的兩種啟動模式
Service 有兩種不同的啟動模式 ,不同的啟動模式對應不同生命周期.
Service 啟動模式主要分兩種: 1. 啟動模式。 2. 綁定模式。
此模式通過 startService()方法啟動,此服務可以在后臺一直運行,不會隨啟動組件的消亡而消亡。只能執行單一操作,無法返回結果給調用方,常用于網絡下載、上傳文件,播放音樂等。
2.綁定模式此模式 通過綁定組件(Activity等)調用 bindService() 啟動,此服務隨綁定組件的消亡而解除綁定。
如果此時沒有其它通過startService()啟動,則此服務會隨綁定組件的消亡而消亡。
多個組件不僅可以同時綁定一個Service,而且可以通過進程間通信(IPC)執行跨進程操作等。
啟動模式與綁定模式的服務可以同時運行,在銷毀服務時,只有兩種模式都不在使用Service時候,才可以銷毀服務,否則會引起異常。
4. 兩種 Service 模式的生命周期兩種 Service 模式的生命周期如下:
2.四大組件之一,必須在Androidmainfest.xml 中注冊 Service 注冊方法如下:注意:... ...
Service 如不注冊 ,不會像Activity 那樣會導致App Crash,Service 不注冊 不會報異常信息,但是服務會起不來,如不注意很容易迷惑。
3.啟動模式通過啟動模式啟動的Service ,如不主動關閉,Service會一直在。
啟動模式啟動服務的方法Intent mBindIntent = new Intent(ServiceMethods.this, BindServiceMethods.class); startService(mStartIntent);啟動模式啟動服務的生命周期
下面是驗證啟動模式啟動服務的生命周期的方法,詳細生命周期請查看上方Service的生命周期圖。
01-03 17:16:36.147 23789-23789/com.android.program.programandroid I/StartService?wjwj:: ----onCreate---- 01-03 17:16:36.223 23789-23789/com.android.program.programandroid I/StartService?wjwj:: ----onStartCommand---- 01-03 17:16:38.174 23789-23789/com.android.program.programandroid I/StartService?wjwj:: ----onDestroy----啟動模式 啟動服務案例
此案例功能:啟動服務,在服務中創建通知
// Service 創建方法 @Override public void onCreate() { super.onCreate(); Log.i(TAG, "----onCreate----"); } // Service 啟動方法 @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "----onStartCommand----"); // 獲取NotificationManager實例 notifyManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // 實例化NotificationCompat.Builder并設置相關屬性 NotificationCompat.Builder builder = new NotificationCompat.Builder( this) // 設置小圖標 .setSmallIcon(R.drawable.ic_launcher) .setLargeIcon( BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)) // 設置通知標題 .setContentTitle("我是通過StartService服務啟動的通知") // 設置通知不能自動取消 .setAutoCancel(false).setOngoing(true) // 設置通知時間,默認為系統發出通知的時間,通常不用設置 // .setWhen(System.currentTimeMillis()) // 設置通知內容 .setContentText("請使用StopService 方法停止服務"); // 通過builder.build()方法生成Notification對象,并發送通知,id=1 notifyManager.notify(1, builder.build()); return super.onStartCommand(intent, flags, startId); } // Service 銷毀方法 @Override public void onDestroy() { Log.i(TAG, "----onDestroy----"); notifyManager.cancelAll(); super.onDestroy(); }4. 綁定模式啟動綁定服務
綁定模式啟動的服務會隨著綁定逐漸的消亡而解除Service綁定,如果此時Service沒有通過啟動模式啟動,則此服務將會被銷毀。
綁定模式啟動綁定服務的方法綁定模式,是通過其他組件啟動的Service。
啟動綁定模式服務的方法// 啟動綁定服務處理方法 public void BtnStartBindService(View view) { // 啟動綁定服務處理方法 bindService(mBindIntent, serviceConnection, Context.BIND_AUTO_CREATE); isBindService = true; Toast.makeText(ServiceMethod.this, "啟動 " + mBindCount + " 次綁定服務", Toast.LENGTH_SHORT).show(); } public void BtnSopBindService(View view) { if (isBindService) { // 解除綁定服務處理方法 unbindService(serviceConnection); Toast.makeText(ServiceMethod.this, "解除 " + mUnBindCount + " 次綁定服務", Toast.LENGTH_SHORT).show(); isBindService = false; } }
綁定服務 隨綁定組件的消亡而消亡
綁定模式 生命周期回調代碼如下:// Service 創建方法 @Override public void onCreate() { super.onCreate(); Log.i(TAG, "----onCreate----"); } // Service 綁定方法 @Override public IBinder onBind(Intent intent) { Log.i(TAG, "----onBind----"); MyBinder myBinder = new MyBinder(); return myBinder; } // Service 解除綁定方法 @Override public boolean onUnbind(Intent intent) { Log.i(TAG, "----onUnbind----"); return super.onUnbind(intent); } // Service 銷毀方法 @Override public void onDestroy() { Log.i(TAG, "----onDestroy----"); super.onDestroy(); }
綁定服務的生命周期代碼打印Log信息如下:
01-03 20:32:59.422 13306-13306/com.android.program.programandroid I/BindService?wjwj:: ----onCreate---- 01-03 20:32:59.423 13306-13306/com.android.program.programandroid I/BindService?wjwj:: -----onBind----- 01-03 20:33:09.265 13306-13306/com.android.program.programandroid I/BindService?wjwj:: ----onUnbind---- 01-03 20:33:09.266 13306-13306/com.android.program.programandroid I/BindService?wjwj:: ----onDestroy----綁定服務案例
功能:獲取綁定模式啟動 綁定服務及解除綁定服務的次數
綁定服務類package com.android.program.programandroid.component.Service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; public class BindServiceMethods extends Service { private static final String TAG = "BindService wjwj:"; public BindServiceMethods() { } @Override public void onCreate() { super.onCreate(); Log.i(TAG, "----onCreate----"); } @Override public IBinder onBind(Intent intent) { Log.i(TAG, "----onBind----"); MyBinder myBinder = new MyBinder(); return myBinder; } @Override public boolean onUnbind(Intent intent) { Log.i(TAG, "----onUnbind----"); return super.onUnbind(intent); } @Override public void onDestroy() { Log.i(TAG, "----onDestroy----"); super.onDestroy(); } }
組件與綁定服務類之間的交互
// 啟動綁定服務處理方法 public void BtnStartBindService(View view) { bindService(mBindIntent, serviceConnection, Context.BIND_AUTO_CREATE); isBindService = true; Toast.makeText(ServiceMethods.this,"啟動 "+mBindCount+" 次綁定服務",Toast.LENGTH_SHORT).show(); } // 解除綁定服務處理方法 public void BtnSopBindService(View view) { if (isBindService) { unbindService(serviceConnection); Toast.makeText(ServiceMethods.this,"解除 "+mUnBindCount+" 次綁定服務",Toast.LENGTH_SHORT).show(); isBindService=false; } }
組件之間交互所需的 Binder 接口類
/** * 該類提供 綁定組件與綁定服務提供接口 * */ public class MyBinder extends Binder { private int count = 0; public int getBindCount() { return ++count; } public int getUnBindCount() { return count> 0 ? count-- : 0; } }5. 提高服務的優先級
服務默認啟動方式是后臺服務,但是可以通過設置服務為前臺服務,提高服務的優先級,進而避免手機內存緊張時,服務進程被殺掉。
設置前臺服務的兩種方法1.設置為前臺服務
//設置為前臺服務 startForeground(int, Notification)
2.取消前臺服務
//取消為前臺服務 stopForeground(true);startForeground 前臺服務案例
功能:前臺服務綁定通知信息,提高服務進程優先級,否則取消通知信息
package com.android.program.programandroid.component.Service; import android.app.NotificationManager; import android.app.Service; import android.content.Intent; import android.graphics.BitmapFactory; import android.os.IBinder; import android.support.v4.app.NotificationCompat; import com.android.program.programandroid.R; public class MyStartForcegroundService extends Service { public MyStartForcegroundService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent.getAction().equals("start_forceground_service")) { // 獲取NotificationManager實例 NotificationManager notifyManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // 實例化NotificationCompat.Builder并設置相關屬性 NotificationCompat.Builder builder = new NotificationCompat.Builder(this) // 設置小圖標 .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)) // 設置通知標題 .setContentTitle("我是通過startForeground 啟動前臺服務通知") // 設置通知不能自動取消 .setAutoCancel(false) .setOngoing(true) // 設置通知時間,默認為系統發出通知的時間,通常不用設置 // .setWhen(System.currentTimeMillis()) // 設置通知內容 .setContentText("請使用stopForeground 方法改為后臺服務"); //通過builder.build()方法生成Notification對象,并發送通知,id=1 // 設置為前臺服務 startForeground(1, builder.build()); } else if (intent.getAction().equals("stop_forceground_service")) { stopForeground(true); } return super.onStartCommand(intent, flags, startId); } }6. 使用AIDL接口實現遠程綁定
由于內容較多,后續另開一篇詳細介紹。
至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75817.html
摘要:微信小程序的一種框架簡述由于項目原因,我于兩個多月前轉到微信端用進行開發。事件發起組件的所有祖先組件會依次接收到事件。注意,如果用了自定義事件,則中對應的監聽函數不會再執行。 wepy——微信小程序的一種框架 簡述 由于項目原因,我于兩個多月前轉到微信端用wepy進行開發。wepy開發風格接近于 Vue.js,支持組件 Props 傳值,自定義事件、組件分布式復用Mixin、Redux...
摘要:注意類別指示此的圖標應放入系統的應用啟動器。如果元素未使用指定圖標,則系統將使用元素中的圖標使用方法對象是對象的包裝器。主要應用于以下場景通知應用小部件定時任務使用注意事項適用于啟動的。 showImg(https://segmentfault.com/img/remote/1460000019975019?w=157&h=54); 極力推薦文章:歡迎收藏Android 干貨分享 s...
摘要:方法,是一個對象是從構造函數中賦值。上面我們分析到會執行構造函數,在構造函數會將的賦值給的。傳入的是返回對象也是繼承,其是。參考插件化技術原理篇中詳解你所不知道的更深層次的理解 Android插件化在國內已不再是幾個巨頭公司團隊在玩了,陸續有團隊開源其解決方案,例如 Small,VirtualAPK,RePlugin,Atlas,甚至Lody開發的VirtualApp。另外我司也在玩,...
閱讀 2688·2021-10-12 10:12
閱讀 2334·2021-09-02 15:41
閱讀 2560·2019-08-30 15:55
閱讀 1398·2019-08-30 13:05
閱讀 2430·2019-08-29 11:21
閱讀 3534·2019-08-28 17:53
閱讀 3021·2019-08-26 13:39
閱讀 800·2019-08-26 11:50