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

1、使用本地廣播

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裏面去接收這條廣播。

注意點:本地廣播是沒法經過靜態註冊的方式來接收的,其實這也徹底能夠理解,由於靜態註冊主要就是爲了讓程序在未啓動的時候也能收到廣播,而發送本地廣播的時候,咱們的程序就已經啓動了,由於也徹底不須要使用靜態註冊的功能。java

2.使用本地廣播的優點

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

2、實現強制下線功能

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>
  • 後面的咱們下次連載接着寫。

3、源碼:

相關文章
相關標籤/搜索