當前位置:首頁 » 安卓系統 » android全局監聽

android全局監聽

發布時間: 2024-12-21 13:11:02

❶ 在android中怎樣給整個頁面設置監聽事件

您可以類似這樣,先實例化子頁面中的Button控制項,然後將實例化後的控制項綁定監聽事件 View view=LayoutInflater.from(context).inflate(R.layout.abc_action_bar_view_list_nav_layout,null); Button button= (Button) view.findViewById(R.id.action_bar); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //寫上點擊後要執行的事件 } }); 當然了,您要在不同頁面實現不同的功能的話,您可以將以上代碼寫在viewPager.setOnPageChangeListener的滾動回調方法當中進行頁面滾動的判斷,從而執行不同的點擊事件。希望能幫到您,如果還有什麼問題,歡迎您繼續追問。謝謝。

❷ Android監聽網路狀態框架

就這么簡單,讓我們開始吧。

看下最終實現的使用:

日誌:

好了,新建一個AndroidLibray開始實現。

許可權走一波:

首先,咱們需要一個監聽網路狀態的工具類

在lib中創建一個廣播,然後再配置文件里注冊一下。

完善下咱們的receiver:

監聽介面:

manager:

再加上一個枚舉類:

OK,一套正常操作,一個最普通網路監聽類寫完了。接著咱們嘗試用註解,讓這個小框架看的有檔次些。

完善一下自定義註解:

然後來捋一下思路:

照樣是固定三部曲,按照步驟來:

1.先完善我們的注冊方法

在這里,我創建了一個方法封裝類。比較簡單: MethodManager

這里的 mMethodList 是方法封裝類(MethodManager)的List,用來存儲篩選後的MainActivity中方法,也就是網路監聽方法。以下是方法的篩選:

咱們定義一個post方法,去完成這項工作:

這里實現了通過網路監聽註解上方的參數,我們可以單獨監聽某一種網路狀態的變化。比如

上方參數表明,只有在WIFI斷開和連接的時候,方法才會做出響應。想要所有提示設置為AUTO就行啦。

OK,做完邏輯以後執行一下:

大功告成!跑一下看看效果!

項目地址: https://github.com/CocoYuki/NetListener

是一個練手的小項目,實際網路請求在7.0時就能通過一個CallBack輕松搞定了。

❸ Android中有沒有對多個對象的監聽方法,就像觀察者模式一樣

Android
中的監聽器模式與觀察者模式

1、 觀察者模式與監聽器機制

1.1 觀察者模式

1.2 監聽器(Listener)機制

代碼的基本框架:

* 被監控著

package com.wonders.group;

import java.util.Collection;

public class ModelTie {

private Collection<Object> dataSet;

public interface DataSetSupervioer {

public void onChange();

}

private DataSetSupervioer dataSetChangeListener;

public void setDataSetChangeListener(DataSetSupervioer
dataSetChangeListener) {

this.dataSetChangeListener = dataSetChangeListener;

}

public void notifyDataSetChange() {

if (null != dataSetChangeListener) {

dataSetChangeListener.onChange();

}

}

public Collection<Object> getDataSet() {

return dataSet;

}

public ModelTie setDataSet(Collection<Object> dataSet)
{

this.dataSet = dataSet;

this.notifyDataSetChange(); // 數據設置完畢要通知監聽器進行更新操作

return this;

}

}

* 監控者

package com.wonders.group;

import java.util.Collection;

import java.util.Iterator;

import com.wonders.group.ModelTie.DataSetSupervioer;

public class PresentationTie {

private ModelTie model;

public PresentationTie() {

super();

// 添加監聽器

model.setDataSetChangeListener(new DataSetSupervioer()
{

public void onChange() {

// 填寫一些前置操作,如更新數據

DisplayModel(); // 重新繪制

// 填寫一些後置操作,如更新狀態

}

});

}

public void DisplayModel() {

Collection<Object> collection =
model.getDataSet();

if (collection != null) {

for (Iterator iterator = collection.iterator();
iterator.hasNext();) {

System.out.println(((Object)
iterator.next()).toString());

// 其他等等操作

}

}

}

public ModelTie getModel() {

return model;

}

public void setModel(ModelTie model) {

this.model = model;

}

}

2、
ArrayAdapter的觀察者實現機制

以下僅羅列關鍵代碼:

public class ArrayAdapter<T> extends BaseAdapter implements Filterable
{

private boolean mNotifyOnChange = true;

/**

* Adds the specified object at the end of the array.

*/

public void add(T object) {

if (mOriginalValues != null) {

synchronized (mLock) {

mOriginalValues.add(object);

if (mNotifyOnChange) notifyDataSetChanged();

}

} else {

mObjects.add(object);

if (mNotifyOnChange) notifyDataSetChanged();

}

}

/**

* Inserts the specified object at the specified index in the
array.

*/

public void insert(T object, int index) {

if (mOriginalValues != null) {

synchronized (mLock) {

mOriginalValues.add(index, object);

if (mNotifyOnChange) notifyDataSetChanged();

}

} else {

mObjects.add(index, object);

if (mNotifyOnChange) notifyDataSetChanged();

}

}

/**

* Removes the specified object from the array.

*/

public void remove(T object) {

if (mOriginalValues != null) {

synchronized (mLock) {

mOriginalValues.remove(object);

}

} else {

mObjects.remove(object);

}

if (mNotifyOnChange) notifyDataSetChanged();

}

/**

* Remove all elements from the list.

*/

public void clear() {

if (mOriginalValues != null) {

synchronized (mLock) {

mOriginalValues.clear();

}

} else {

mObjects.clear();

}

if (mNotifyOnChange) notifyDataSetChanged();

}

/**

* Sorts the content of this adapter using the specified
comparator.

*/

public void sort(Comparator<? super T> comparator) {

Collections.sort(mObjects, comparator);

if (mNotifyOnChange) notifyDataSetChanged();

}

@Override

public void notifyDataSetChanged() {

super.notifyDataSetChanged(); //
關鍵代碼,這個notifyDataSetChanged()是從父類BaseAdapter繼承過來的,所以看看在父類中它幹了些什麼

mNotifyOnChange = true;

}

}

/**

* Common base class of common implementation for an {@link
Adapter} that can be

* used in both {@link ListView} (by implementing the
specialized

* {@link ListAdapter} interface} and {@link Spinner} (by
implementing the

* specialized {@link SpinnerAdapter} interface.

*/

public abstract class BaseAdapter implements ListAdapter,
SpinnerAdapter {

private final DataSetObservable mDataSetObservable = new
DataSetObservable();

public void registerDataSetObserver(DataSetObserver observer)
{

這對方法用來注冊或注銷

觀察ArrayAdapter的觀察者的

mDataSetObservable.registerObserver(observer);

}

public void unregisterDataSetObserver(DataSetObserver
observer) {

mDataSetObservable.unregisterObserver(observer);

}

/**

* Notifies the attached View that the underlying data has
been changed

* and it should refresh itself.

*/

public void notifyDataSetChanged() {

mDataSetObservable.notifyChanged(); //
關鍵代碼:說明調的是成員變數mDataSetObservable的方法,所以進入DataSetObservable看看具體是如何操作的

}

public void notifyDataSetInvalidated() {

mDataSetObservable.notifyInvalidated();

}

}

package android.database;

/**

* A specialization of Observable for DataSetObserver that
provides methods for

* invoking the various callback methods of DataSetObserver.

*/

public class DataSetObservable extends
Observable<DataSetObserver> {

/**

* Invokes onChanged on each observer. Called when the data
set being observed has

* changed, and which when read contains the new state of the
data.

*/

public void notifyChanged() {

synchronized(mObservers) {

for (DataSetObserver observer : mObservers) { //
這里的mObservers是哪來的呢?繼續追蹤,但首先可以判斷是來自Observable<DataSetObserver>的。進入看看

observer.onChanged();

}

}

}

/**

* Invokes onInvalidated on each observer. Called when the
data set being monitored

* has changed such that it is no longer valid.

*/

public void notifyInvalidated() {

synchronized (mObservers) {

for (DataSetObserver observer : mObservers) {

observer.onInvalidated();

}

}

}

}

public abstract class Observable<T> {

/**

* The list of observers. An observer can be in the list at
most

* once and will never be null.

*/

protected final ArrayList<T> mObservers = new
ArrayList<T>();

public void registerObserver(T observer) {

if (observer == null) {

throw new IllegalArgumentException("The observer is
null.");

}

synchronized(mObservers) {

if (mObservers.contains(observer)) {

throw new IllegalStateException("Observer " +
observer + " is already registered.");

}

mObservers.add(observer);

}

}

public void unregisterObserver(T observer) {

if (observer == null) {

throw new IllegalArgumentException("The observer is
null.");

}

synchronized(mObservers) {

int index = mObservers.indexOf(observer);

if (index == -1) {

throw new IllegalStateException("Observer " +
observer + " was not registered.");

}

mObservers.remove(index);

}

}

public void unregisterAll() {

synchronized(mObservers) {

mObservers.clear();

}

}

}

❹ Android 超簡單實現網路狀態的監聽

我們做項目的時候,不可避免的要做網路狀態的監聽,一般我們都是抽取出一個工具類來實現,比如:

細致的你當然還會再寫一個判斷網路類型的方法,反手再來一個例:

然後就可以在相應的操作前進行判斷網路的判斷:

但是這樣做也有些問題:

接下來就是本文的重點,如何通過 NetStatusBus 這個庫來解決以上問題,讓你的網路狀態監聽變得前所未有的簡單粗暴。

到這里就已經結束了,你的所有網路操作已經都可以清晰優雅的在訂閱方法中進行處理了,當然你也可以繼續往下看。

訂閱方法必須填寫一個NetType參數,可以通過NetType的值來判斷當前網路類型。

@NetSubscribe中 netType為可選值,可以設置訂閱的類型,可選值類型如下:

NetType.AUTO

這是默認值,任何網路狀態發生變化,該類型訂閱者都會被回調。同時會傳入NetType參數告知你當前的網路類型,示例如下:

只要當前是由 WIFI 改變引發的網路狀態變化,該類型訂閱者都會被回調。同時會傳入NetType參數告知你當前的網路類型,示例如下:

只要當前是由移動網路改變引發的網路狀態變化,該類型訂閱者都會被回調。同時會傳入NetType參數告知你當前的網路類型,示例如下:

NetType.NONE

只有當網路丟失時,該類型訂閱者才會被回調。

有人會覺得,我用個庫爽就行了管它的原理干什麼?

你放心,我只是小小的描述一下實現方式。

原理簡單來說,就是在全局初始化的時候就綁定對網路的變化監聽。然後將進行注冊的父類所有的訂閱方法保存至集合中,這里涉及到一些方法的校驗,最後在網路狀態發生改變時利用 Java 反射機制遍歷執行所有訂閱方法。熟悉 EventBus 的小夥伴已經看出來了這里借鑒了一小部分 EventBus 的思想。

回到第一步,那麼具體是如何綁定對網路狀態變化的監聽呢?

以前我們是通過注冊廣播來實現綁定網路變更的監聽,在Android 7.0 以後,Google 基於性能和安全原因對廣播進行了很多限制,比如監聽網路變更的廣播 android.net.conn.CONNECTIVITY_CHANGE 使用靜態注冊的方式則無法生效,而動態注冊的方式雖然可以生效但畢竟不是最優解。

同樣出於性能和安全,以及擁抱變化的角度,最終我們還是使用官方推薦的方式,利用 ConnectivityManager.NetworkCallback 來進行網路變化的監聽,這是在Android 5.0即android api 21推出的API,目前Android 5.0以上的市場佔有率在 85%以上,隨著國內各大廠商正在積極的推進適配普及Android Q,這個比例還會進一步增大,所以個人人認為無需過於擔心低版本適配。

使用的時候出現這個問題是由於少添加了許可權。

Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.

java.lang.RuntimeException: Unable to create application com.jiyun.wanandroid.WanApplication: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.

加上這幾個許可權就好了:

附上原文地址: https://www.jianshu.com/p/2fea980b3e56

熱點內容
pythonhttp異常處理 發布:2024-12-21 15:42:12 瀏覽:145
百度上如何連接伺服器看視頻 發布:2024-12-21 15:42:11 瀏覽:340
java論壇網站源碼 發布:2024-12-21 15:32:04 瀏覽:736
資料庫語言刪除 發布:2024-12-21 15:32:03 瀏覽:512
加密的文件夾解密軟體 發布:2024-12-21 15:24:06 瀏覽:502
losus初始密碼是什麼 發布:2024-12-21 15:24:06 瀏覽:28
三星s5刪除文件夾 發布:2024-12-21 15:23:22 瀏覽:888
我的世界生存伺服器大亂斗 發布:2024-12-21 15:23:21 瀏覽:273
自私演算法 發布:2024-12-21 15:21:55 瀏覽:696
java正則引號 發布:2024-12-21 15:20:02 瀏覽:383