Android開發從0開始(廣播)

應用廣播

發送標準廣播的三步驟

發送標準廣播:

//發送標準廣播

Intent intent =new Intent("com.dongnaoedu.chapter09.standard");

sendBroadcast(intent);

定義廣播接受者:

public class StanderdReceiver extends BroadcastReceiver {

public ?static final String ?STANDARD_ACTION="com.dongnaoedu.chapter09.standard";

//一旦收到廣播就會觸發onReceive的方法

?@Override

public void onReceive(Context context, Intent intent) {

if(intent!=null &&intent.getAction().equals(STANDARD_ACTION)){

Log.d("ning","收到一個標準廣播"); ???} ??} ??}

開關廣播接受者:

protected void onStart()

????{

????????super.onStart();

????????standerdReceiver = new StanderdReceiver();

????????//創建一個意圖過濾器,只處理STANDARD_ACTION廣播

????????IntentFilter filter = new IntentFilter(StanderdReceiver.STANDARD_ACTION);

????????registerReceiver(standerdReceiver,filter);

????}

protected void onStop()

????{

????????super.onStop();

????????//注銷接收器

????????unregisterReceiver(standerdReceiver);

}

發送有序廣播:(可截斷廣播abortBroadcast())

發送標準廣播:

?Intent intent=new Intent(ORDER_ACTION);

?sendOrderedBroadcast(intent,null);

定義廣播接受者:

????public void onReceive(Context context, Intent intent) {

????????if(intent!=null&&intent.getAction().equals(BoradOraderActivity.ORDER_ACTION)){

????????????Log.d("ning","接收器B收到一個有序廣播");

????????}

}

public void onReceive(Context context, Intent intent) {

if(intent!=null&&intent.getAction().equals(BoradOraderActivity.ORDER_ACTION)){

?????????????Log.d("ning","接收器A收到一個有序廣播");

????????}

????}

開關廣播接受者:

??protected void OnStart()

????{

????????super.onStart();

????????//注冊廣播A

????????orderAReceiver = new OrderAReceiver();

????????IntentFilter filterA=new IntentFilter(ORDER_ACTION);

????????filterA.setPriority(3);

????????registerReceiver(orderAReceiver,filterA);

????????//注冊廣播B

????????orderBReceiver = new OrderBReceiver();

????????IntentFilter filterB=new IntentFilter(ORDER_ACTION);

????????filterB.setPriority(6);

????????registerReceiver(orderAReceiver,filterB);

????}

????protected void OnStop()

????{

????????super.onStop();

????????unregisterReceiver(orderAReceiver);

????????unregisterReceiver(orderBReceiver);

????}

靜態注冊廣播:(不推薦

??在AndroidManifest.xml中注冊,為靜態注冊

???權限<uses-permission android:name="android.permission.VIBRATE"/>

注冊部分:<intent-filter>

????????????<action android:name="com.dongnaoedu.chapter09.shock"/>

??????????</intent-filter>

廣播定義: ??public void onReceive(Context context, Intent intent) {

????????if(intent!=null&&intent.getAction().equals(SHOCK_ACTION))

????????{

????????????Log.d("ning","震動");

?????Vibrator vb= (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);

????????????vb.vibrate(500);

????????}

????}

廣播發送

public void onClick(View view) {

????????String fullName="com.dongnaoedu.chapter09.shock";

????????Intent intent =new Intent("com.dongnaooedu.chapter09.shock");

????????//指定接收路徑

????????ComponentName componentName=new ComponentName(this,fullName);

????????//設置組件意圖

????????intent.setComponent(componentName);

????????sendBroadcast(intent);}

系統廣播

??由系統發送的廣播,故注冊一個廣播接受者即可。

系統分鐘到達廣播

??????protected void onStart(){

????????super.onStart();

????????//注冊一個分鐘變更的廣播接收器

????????timeReceiver = new TimeReceiver();

????????IntentFilter filter= new IntentFilter(Intent.ACTION_TIME_TICK);

????????registerReceiver(timeReceiver,filter);

????}

????protected void onStop(){

????????super.onStop();

????????//取消注冊廣播

????????unregisterReceiver(timeReceiver);

}

系統網絡變更廣播

??????protected void onStart(){

????????super.onStart();

????????//注冊網絡變更的廣播接收器

????????networkReceiver = new NetWorkReceiver();

????????IntentFilter filter= new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");

????????registerReceiver(networkReceiver,filter);

????}

????protected void onStop(){

????????super.onStop();

????????//取消注冊廣播

????????unregisterReceiver(networkReceiver);}

?屏幕變更事件

?定時管理器:AlarmManager

①定義定時管理器AlarmReceiver

public class AlarmReceiver extends BroadcastReceiver {

public static final String ALARM_ACTION="com.dongnaoedu.chapter09.alarm";

private final Context mContext;

public AlarmReceiver(Context context){

????????super();

????????this.mContext=context; }

@Override

????public void onReceive(Context context, Intent intent) {

????????if(intent!=null && intent.getAction().equals(ALARM_ACTION) )

????????{??Log.d("ning","收到鬧鐘廣播"); ?}???}

??//發送鬧鐘廣播的方法

????public ?void ?sendAlarm()

????{ ??//設置意圖給延時意圖使用

????????Intent intent= new Intent(ALARM_ACTION);

????????//設置用于廣播的延遲意圖

????????PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,0,intent,PendingIntent.FLAG_IMMUTABLE);

????????//從系統中拿到鬧鐘管理器

????????AlarmManager alarmManager=(AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

????????//判斷版本,Android6.0

????????if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){

????????????alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,1000,pendingIntent);

????????}else

????????{

????????????//設置鬧鐘管理器(android6.0,后該方法,在滅屏不保證發送廣播)

????????????alarmManager.set(AlarmManager.RTC_WAKEUP,1000,pendingIntent);

????????}

????}

}

注冊定時管理器

??public class AlarmActivity extends AppCompatActivity implements View.OnClickListener {

????private AlarmReceiver alarmReceiver;

????@Override

????protected void onCreate(Bundle savedInstanceState) {

????????super.onCreate(savedInstanceState);

????????setContentView(R.layout.activity_alarm);

????????findViewById(R.id.btn_alarm).setOnClickListener(this);

????}

????@Override

public void onClick(View view) {alarmReceiver.sendAlarm(); }

????protected void onStart(){

????????super.onStart();

????????alarmReceiver = new AlarmReceiver(getApplicationContext());

????????IntentFilter filter=new IntentFilter(AlarmReceiver.ALARM_ACTION);

????????registerReceiver(alarmReceiver,filter);

????}

????protected void onStop(){

????????super.onStop();

????????unregisterReceiver(alarmReceiver);

????}

}

豎屏與橫屏切換

??切換時會將之前的生命周期結束,重新創建一個新的生命周期。若想不重啟,則

①在AndroidManifest.xml中,給activity節點增加Android:configChanges。

②修改活動頁面java代碼,重寫活動的onConfigurationChanged方法。

在AndroidManifest.xml中配置Android:screenOrientation=”portrait”可以指定橫屏或豎屏

回到桌面與切換任務列表:

??通過Intent.ACTION_CLOSE_SYSTEM_DIALOGS可判斷是否回到桌面,任務列表是否打開。

??收到意圖中reason字段,值為homekey時表示為回桌面,recentapps時為打開任務列表。

??在AndroidManifest.xml中加入android:supportsPictureInPicture="true"支持畫中畫權限

public class ReturnDesktopActivity extends AppCompatActivity {

????private DesktopRecevier desktopRecevier;

????@Override//在創建函數中注冊畫中畫

????protected void onCreate(Bundle savedInstanceState) {

????????super.onCreate(savedInstanceState);

????????setContentView(R.layout.activity_return_desktop);

????????desktopRecevier = new DesktopRecevier();

????????IntentFilter filter=new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);

????????registerReceiver(desktopRecevier,filter);

????}

//注銷畫中畫

????@Override

????protected void onDestroy() {

????????super.onDestroy();

????????unregisterReceiver(desktopRecevier);

????}

????//進入畫中畫模式或退出畫中畫時觸發

????@Override

????public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {

????????super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);

????????if(isInPictureInPictureMode){

????????????Log.d("ning","進入畫中畫模式");

????????}else {

????????????Log.d("ning","退出畫中畫模式");

????????}

????}

????//定義一個返回桌面的廣播接收器

private class DesktopRecevier extends BoradOraderActivity{

public void onReceive(Context context, Intent intent){

if(intent!=null&&intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)){

String reason=intent.getStringExtra("reason");

??????????????if(!TextUtils.isEmpty(reason)&&(reason.equals("homekey")||reason.equals("recentapps"))){

??????????????????//android 8.0后才有畫中畫判斷一下

?if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O&&!isInPictureInPictureMode())

??{????????????//創建畫中畫模式的參數構建器

???PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder();

????Rational ratio = new Rational(10,5);?//指定屏幕寬高比例

????builder.setAspectRatio(ratio); ?????????????????????enterPictureInPictureMode(builder.build());???//進入畫中畫 ??????} ??????} ???} ??} }?}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166734.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166734.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166734.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在ASP.NET Core 中使用 .NET Aspire 消息傳遞組件

前言 云原生應用程序通常需要可擴展的消息傳遞解決方案&#xff0c;以提供消息隊列、主題和訂閱等功能。.NET Aspire 組件簡化了連接到各種消息傳遞提供程序&#xff08;例如 Azure 服務總線&#xff09;的過程。在本教程中&#xff0c;小編將為大家介紹如何創建一個 ASP.NET …

PLC通過RS232轉PROFINET與電子分析天平秤通訊案例

本案例是通過用興達易控的XD-PNR200型RS232轉Profinet網關連接電子分析天平秤與PLC通訊的配置案例&#xff0c;用到設備為西門子S7-1200PLC&#xff0c;RS232轉Profinet網關&#xff0c;電子分析天平秤。 打開博圖&#xff0c;添加PLC&#xff1b;本案例使用的是1200PLC。 添加…

『接口測試干貨』| Newman+Postman接口自動化測試完整過程

『接口測試干貨』| NewmanPostman接口自動化測試完整過程 1 Newman簡介2 如何安裝Newman&#xff1f;2.1 安裝NodeJs2.2 安裝Newman2.2 解決Newman不是內部命令 3 Newman使用3.1 Newman如何運行集合&#xff1f;3.2 如何查看幫助文檔&#xff1f;3.3 環境變量設置3.4 關于全局變…

微信小程序制作

如果你也想搭建一個小程序&#xff0c;但不知道如何入手&#xff0c;那么今天我就教你如何使用第三方制作平臺&#xff0c;在短短三十分鐘內搭建一個小程序。 一、登錄小程序制作平臺 首先&#xff0c;登錄到小程序制作平臺的官方網站或應用程序&#xff0c;進入后臺管理系統。…

【Oracle OCP考試】1z0-082(4)

1.Which two statements are true about the PMON background process? A. It rolls back transactions when a process fails&#xff08;當進程失敗時&#xff0c;它回滾事務&#xff09; B. It registers database services with all local and remote listeners known to…

文章解讀與仿真程序復現思路——電網技術 EI\CSCD\北大核心《考慮5G基站儲能可調度容量的有源配電網協同優化調度方法》

這篇文章的標題涉及到以下關鍵概念&#xff1a; 5G基站&#xff1a; 提到了5G基站&#xff0c;這表明文章的焦點可能是與第五代移動通信技術相關的內容。5G技術對于提高通信速度、降低延遲以及支持大規模連接等方面有顯著的改進&#xff0c;因此對于基站的電力需求和供應可能存…

2023年ESG投資研究報告

第一章 ESG投資概況 1.1 定義 ESG投資&#xff0c;亦稱負責任投資&#xff0c;是一種融合環境&#xff08;Environment&#xff09;、社會&#xff08;Social&#xff09;和治理&#xff08;Governance&#xff09;考量的投資方法&#xff0c;旨在通過綜合這些因素來優化投資…

美國汽車零部件巨頭 AutoZone 遭遇網絡攻擊

Security Affairs 網站披露&#xff0c;美國汽車配件零售商巨頭 AutoZone 稱其成為了 Clop MOVEit 文件傳輸網絡攻擊的受害者&#xff0c;導致大量數據泄露。 AutoZone 是美國最大的汽車零配件售后市場經銷商之一&#xff0c;在美國、墨西哥、波多黎各、巴西和美屬維爾京群島經…

算法-技巧-簡單-只出現一次的數字、多數元素

記錄一下算法題的學習10 只出現一次的數字 leetcode題目&#xff1a;給你一個 非空 整數數組 nums &#xff0c;除了某個元素只出現一次以外&#xff0c;其余每個元素均出現兩次。找出那個只出現了一次的元素。你必須設計并實現線性時間復雜度的算法來解決此問題&#xff0c;且…

「Whale 帷幄」連續入選科技榜單,AGI 沖擊波正在加速行業洗牌

以 AGI 為底座&#xff0c;品牌 MarTech 正在經歷一場前所未有的深度變革。 近日&#xff0c;彎弓研究院發布「中國 MarTech 500 強榜單」&#xff0c;以 2023 中國營銷技術&#xff08;MarTech&#xff09;生態為研究對象&#xff0c;洞察行業現象與未來趨勢。作為品牌數字化…

AMEYA360:蔡司新能源汽車解決方案驅動產業未來

電動化正在重塑中國汽車工業。自中國汽車工業開始發展以來&#xff0c;在電動化和智能化的浪潮推動下&#xff0c;汽車行業從未面臨著如此巨大的變革。得益于中國汽車產業尤其是新能源車過去十余年的激流勇進&#xff0c;消費者對新能源汽車的接受度也在發生轉變。新能源汽車市…

2016年全國碩士研究生入學統一考試管理類專業學位聯考英語(二)試題

Section IUse of English Directions: Read the following text.Choose the best word(s) for each numbered blank and mark A&#xff0c;B,Cor D on the ANSWER SHEET.(10 points)   Happy people work differently.They’re more productive&#xff0c;more creative&am…

前后端性能優化實踐(含Java代碼部分、數據庫部分、React前端部分)

最近的一個大屏報表統計的接口查詢速度很慢&#xff0c;耗時近一分鐘左右&#xff0c;數據量級只是700萬左右&#xff0c;但很慢&#xff0c;最后優化到4秒左右&#xff0c;客戶還能接受&#xff0c;但其實還可以在優化&#xff0c;先這樣吧&#xff0c;簡單記錄下。這次主要優…

App Inventor 2 文本轉數字

App Inventor 2 是弱語言類型&#xff0c;文本和數字之間不用刻意去轉換&#xff0c;之間賦值就可以了。文本賦值給數字變量如下&#xff1a; 運行結果&#xff1a;124 注意&#xff1a;數字變量初始化的時候要給一個數字的初始值&#xff0c;表明它是數字。 如果文本中含有非…

java與c++中的分支語句switch的不同

java中的switch后可用字符串,而C只能用字符和數字 switch(suffix){case "js":contentType"text/javascript";break;case "css":contentType"text/css";break;}c switch (x){case 0:case 1:case 2:rth 3;break;case 3:case 4:case 5:r…

系列三、事務

一、事務 1.1、概述 事務是數據庫操作的基本單元&#xff0c;它是指邏輯上的一組操作&#xff0c;要么都成功&#xff0c;要么都失敗。典型場景&#xff1a;轉賬&#xff0c;例如Jack給Rose轉賬1000元&#xff0c;轉賬成功&#xff1a;Jack賬戶的余額少1000元&#xff0c;Rose…

關于進制的轉化

二進制轉十進制&#xff1a; &#x1f530; 方法一&#xff1a;二進制轉十進制&#xff0c;用各數的碼位與位權的乘積之和&#xff0c;說白了就是用從右到左的每個數去乘以2的冪次方&#xff08;最右邊是0&#xff09;&#xff0c;然后就所有的數相加。 補充&#xff1a;位權是…

<藍橋杯軟件賽>零基礎備賽20周--第7周--棧和二叉樹

報名明年4月藍橋杯軟件賽的同學們&#xff0c;如果你是大一零基礎&#xff0c;目前懵懂中&#xff0c;不知該怎么辦&#xff0c;可以看看本博客系列&#xff1a;備賽20周合集 20周的完整安排請點擊&#xff1a;20周計劃 每周發1個博客&#xff0c;共20周&#xff08;讀者可以按…

VMware共享文件夾不能放mysql的數據

概要 使用VMware搭建了一個虛擬機&#xff0c;準備做數據庫服務器。服務器是linux系統&#xff0c;安裝了mysql和redis。為了數據安全&#xff0c;準備將mysql的數據文件放到共享文件夾中&#xff0c;嘗試多次后都沒成功。問題可能是共享文件夾中的文件的擁有者都是root&#…

MFC所有控件介紹及基本使用

一、前言 本篇文檔介紹了MFC控件的基本使用&#xff0c;同時提供了關于MFC控件使用的工程代碼&#xff0c;程序界面如下圖&#xff0c;有興趣的可以到文檔最后的鏈接處進行下載。 二、控件介紹 2.1 Button &#xff08;按鈕&#xff09; 2.2 CheckBox&#xff08;復選框&am…