当前位置:首页 » 安卓系统 » 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

热点内容
如何安装linux虚拟机 发布:2024-12-21 16:14:53 浏览:441
台湾服务器节点选什么物理机 发布:2024-12-21 16:13:31 浏览:94
linux获取 发布:2024-12-21 16:04:26 浏览:974
www无法访问 发布:2024-12-21 16:01:10 浏览:755
服务器有什么应用软件 发布:2024-12-21 15:48:11 浏览:26
python硬件开发 发布:2024-12-21 15:46:36 浏览:460
pythonhttp异常处理 发布:2024-12-21 15:42:12 浏览:146
百度上如何连接服务器看视频 发布:2024-12-21 15:42:11 浏览:341
java论坛网站源码 发布:2024-12-21 15:32:04 浏览:737
数据库语言删除 发布:2024-12-21 15:32:03 浏览:513