Android連載24-本地廣播和強制下線功能

来源:https://www.cnblogs.com/ruigege0000/archive/2020/07/11/13285057.html
-Advertisement-
Play Games

一、使用本地廣播 1.本地廣播一個舉例 package com.example.broadcasttest2; import android.app.Activity; import android.content.BroadcastReceiver; import android.content. ...


一、使用本地廣播

1.本地廣播一個舉例

package com.example.broadcasttest2;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
 
 private IntentFilter intentFilter;
 
 private LocalReceiver localReceiver;
 
 private LocalBroadcastManager localBroadcastManager;
 
 private NetworkChangeReceiver networkChangeReceiver;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  intentFilter = new IntentFilter();
  intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
  networkChangeReceiver = new NetworkChangeReceiver();
  registerReceiver(networkChangeReceiver,intentFilter);
  localBroadcastManager = LocalBroadcastManager.getInstance(this);//獲取實例
  
  Button button = (Button) findViewById(R.id.button);
  button.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    //下麵這行代碼是用來全局廣播的
//    Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
    //下麵這行代碼是用來本地廣播的(也就是app內部傳遞廣播)
    Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
    localBroadcastManager.sendBroadcast(intent);//發送本地廣播    
//    sendBroadcast(intent);
    //我們關閉上面一行代碼,然後寫另一種方法sendOrderedBroadcast,發送有序廣播
    sendOrderedBroadcast(intent,null);
   }
  });
  intentFilter = new IntentFilter();
  intentFilter.addAction("com.example.broadcasttest.LOCAL_BROACAST");
  localReceiver = new LocalReceiver();
  localBroadcastManager.registerReceiver(localReceiver,intentFilter);//註冊本地廣播監聽器
  
  
 }
 
 @Override
 protected void onDestroy() {
  super.onDestroy();
//  unregisterReceiver(networkChangeReceiver);
  localBroadcastManager.unregisterRecerver(localReceiver);
  
 }
 
 class NetworkChangeReceiver extends BroadcastReceiver{
  @Override
  public void onReceive(Context context,Intent intent) {
   ConnectivityManager connectionMananger = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
   NetworkInfo networkInfo = connectionMananger.getActiveNetworkInfo();
   if(networkInfo != null && networkInfo.isAvailable()) {
    Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();    
   } else {
    Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();
   }
   
  }
 }
 
 class LocalReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context,Intent intent) {
   Toast.makeText(context,"received local broadcast",Toast.LENGTH_SHORT).show();
  }
 }
}
  • 通過LocalBroadcastManagergetInstance()方法來獲取一個實例,註冊廣播是用的registerReceiver()方法,傳入的參數一個是localReceiver的內部實例,一個是IntentFilter實例。最後在onCreate方法中調用發送廣播的方法。
  • 最後我們在按鈕的點擊事件裡面發送一條com.example.broadcasttest.LOCAL_BROADCAST廣播,然後在LocalReceiver裡面去接收這條廣播。

註意點:本地廣播是無法通過靜態註冊的方式來接收的,其實這也完全可以理解,因為靜態註冊主要就是為了讓程式在未啟動的時候也能收到廣播,而發送本地廣播的時候,我們的程式就已經啟動了,因為也完全不需要使用靜態註冊的功能。

2.使用本地廣播的優勢

(1)程式內部傳遞,防止機密數據泄露;
(2)其他程式無法將廣播發送到我們的程式內部,防止安全漏洞的隱患;
(3)發送本地廣播更加高效。

二、實現強制下線功能

1.實現強制下線的邏輯

  • 無論在我們在程式的哪個活動界面,一旦收到強制下線的廣播,就跳出來一個界面,必須點擊“確認“,然後直接跳轉到登錄界面。

2.首先創建一個類用於管理所有的活動

package com.example.broadcastbestpractice;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;

public class ActivityCollector {
 
 public static List<Activity> activities = new ArrayList<Activity>();
 
 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();
   }
  }
 }
}

3.創建一個基類BaseActivity作為所有活動的父類

package com.example.broadcastbestpractice;

import android.app.Activity;
import android.os.Bundle;

public class BastActivity extends Activity {
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ActivityCollector.addActivity(this);
 }
 
 @Override
 public void onDestroy() {
  super.onDestroy();
  ActivityCollector.removeActivity(this);
 }
}

4.接著需要建立一個登錄頁面的佈局

<?xml version="1.0" encoding="utf-8"?>
<!-- 
 android:shrinkColumns設置允許被收縮的列序號
 android:strectColumns設置允許被拉伸的列序號 -->
<TableLLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:strectColumns = "1" >
    
    <TableRow>
        <TextView
            android:layout_height = "wrap_content"
            android:text="Account:" />
        
        <EditText
            android:id="@+id/account"
            android:layout_height="wrap_content"
            android:hint="Input your account" />       
    </TableRow>
    
    <TableRow>
        <TextView
            android:layout_height="wrap_content"
            android:text="Password:" />
        
        <EditTest
            android:id="@+id/password"
            android:layout_height="wrap_content"
            android:inputType="textPassword" />        
    </TableRow>
    
    <TableRow>
        <Button
            android:id="@+id/login"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:text="Login" />
    </TableRow>

</TableLayout>
  • 後面的我們下次連載接著寫。

三、源碼:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本篇是《利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可輕鬆IAP》的續集,上篇文章基本上把ROM API原理及使用講得很透徹了,但文中賣了一個關子,即i.MXRT1xxx系列一共出了7款型號,但並不是每個型號都開放了ROM API,最早誕生的三款型號(105x、102... ...
  • 一 虛擬主機 1.1 虛擬主機概念 對於Nginx而言,每一個虛擬主機相當於一個在同一臺伺服器中卻相互獨立的站點,從而實現一臺主機對外提供多個 web 服務,每個虛擬主機之間是獨立的,互不影響的。 1.2 虛擬主機類型 通過 Nginx 可以實現虛擬主機的配置,Nginx 支持三種類型的虛擬主機配置 ...
  • 容器是一種清理級、可移植、自包含的軟體打包技術,使應用程式可以在幾乎任何地方以相同的方式運行。 ...
  • 容器是一種清理級、可移植、自包含的軟體打包技術,使應用程式可以在幾乎任何地方以相同的方式運行。 ...
  • 容器是一種清理級、可移植、自包含的軟體打包技術,使應用程式可以在幾乎任何地方以相同的方式運行。 ...
  • Modbus的CRC校驗實驗 表述 Name : "CRC-16/MODBUS" Width : 16 Poly : 8005 Init : FFFF RefIn : True RefOut : True XorOut : 0000 Check : ? 先參考一些廠家給的MODBUS校驗程式 con ...
  • 本文更新於2020-06-14,使用MySQL 5.7,操作系統為Deepin 15.4。 在指定參數選項時有兩種方式: “-”+單個縮寫字元+值,值前可加上空白符(“-p”選項例外,若加上則認為稍後輸入密碼,空白後面的值並不被認作密碼)。 “--”+完整單詞+“=”+值 所有工具會使用一些通用選項 ...
  • SQL自學筆記 事務 1.0事務的基本介紹 2.0 事務的自動提交&手動提交 3.0 事務的四大特征 4.0 事務的隔離級別 DCL ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...