Skip to content

Commit

Permalink
修改动态注册
Browse files Browse the repository at this point in the history
  • Loading branch information
sunyatas committed Apr 2, 2019
1 parent 78b4b2c commit 650d8d9
Show file tree
Hide file tree
Showing 7 changed files with 290 additions and 15 deletions.
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<application
android:name=".BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
Expand Down
21 changes: 21 additions & 0 deletions app/src/main/java/com/sunchen/netobserver/BaseApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.sunchen.netobserver;

import android.app.Application;

import com.sunchen.networkobserver.NetworkManager;

/**
* Created by 「孙晨」 on 2019/4/2 22:19.
* <p>
* God bless me only
* <p>
* BaseApplication
*/

public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
NetworkManager.getInstance().init(this);
}
}
38 changes: 37 additions & 1 deletion app/src/main/java/com/sunchen/netobserver/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import android.view.View;

import com.sunchen.networkobserver.NetworkManager;
import com.sunchen.networkobserver.annotation.Network;
import com.sunchen.networkobserver.listenter.NetChangeObserver;
import com.sunchen.networkobserver.type.NetType;
import com.sunchen.networkobserver.utils.Constrants;
Expand All @@ -16,7 +17,9 @@ public class MainActivity extends AppCompatActivity implements NetChangeObserver
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NetworkManager.getInstance().init(getApplication()).setListener(this);

NetworkManager.getInstance().registerObserver(this);

findViewById(R.id.btn_to_setting).setOnClickListener(this);
}

Expand All @@ -34,4 +37,37 @@ public void onDisConnect() {
public void onClick(View view) {
NetworkUtils.openSetting(this, Constrants.SETTING_REQUEST_CODE);
}

@Network(netType = NetType.WIFI)
public void network(NetType netType) {
switch (netType) {
case CMWAP:
Log.e(Constrants.LOG_TAG, "CMWAP");
break;
case CMNET:
Log.e(Constrants.LOG_TAG, "CMNET");
break;

case WIFI:
Log.e(Constrants.LOG_TAG, "WIFI");
break;

case NONE:
Log.e(Constrants.LOG_TAG, "NONE");
break;

case AUTO:
Log.e(Constrants.LOG_TAG, "AUTO");
break;

}
}

@Override
protected void onDestroy() {
super.onDestroy();
NetworkManager.getInstance().unRegisterObserver(this);
NetworkManager.getInstance().unRegisterAllObserver();

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.sunchen.networkobserver;

/**
* Created by 「孙晨」 on 2019/4/2 22:28.
* <p>
* God bless me only
* <p>
* MethodManager
*/

import com.sunchen.networkobserver.type.NetType;

import java.lang.reflect.Method;

/**
* 保存符合要求的网络监听注解方法
*/
public class MethodManager {

//参数类型
private Class<?> clazz;

// 网络类型
private NetType netType;

// 需要这执行的方法
private Method method;

public MethodManager(Class<?> clazz, NetType netType, Method method) {
this.clazz = clazz;
this.netType = netType;
this.method = method;
}



public Class<?> getClazz() {
return clazz;
}

public void setClazz(Class<?> clazz) {
this.clazz = clazz;
}

public NetType getNetType() {
return netType;
}

public void setNetType(NetType netType) {
this.netType = netType;
}

public Method getMethod() {
return method;
}

public void setMethod(Method method) {
this.method = method;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,21 @@
import android.content.Intent;
import android.util.Log;

import com.sunchen.networkobserver.annotation.Network;
import com.sunchen.networkobserver.listenter.NetChangeObserver;
import com.sunchen.networkobserver.type.NetType;
import com.sunchen.networkobserver.utils.Constrants;
import com.sunchen.networkobserver.utils.NetworkUtils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* Created by 「孙晨」 on 2019/3/31 0031 18:31.
* <p>
Expand All @@ -22,15 +32,19 @@ public class NetStateReceiver extends BroadcastReceiver {

private NetType netType;//网络类型

private NetChangeObserver listener;//网络监听
// private NetChangeObserver listener;//网络监听

private Map<Object, List<MethodManager>> networkList;


public NetStateReceiver() {
netType = NetType.NONE;
networkList = new HashMap<>();
}

public void setListener(NetChangeObserver listener) {
this.listener = listener;
}
// public void setListener(NetChangeObserver listener) {
// this.listener = listener;
// }

@Override
public void onReceive(Context context, Intent intent) {
Expand All @@ -43,15 +57,124 @@ public void onReceive(Context context, Intent intent) {
netType = NetworkUtils.getNetType();
if (NetworkUtils.isNetworkAvailable()) {
Log.e(Constrants.LOG_TAG, "网络连接成功");
if (listener != null) {
listener.onConnect(netType);
}
// if (listener != null) {
// listener.onConnect(netType);
// }
} else {
Log.e(Constrants.LOG_TAG, "没有网络连接");
if (listener != null) {
listener.onDisConnect();
// if (listener != null) {
// listener.onDisConnect();
// }
}

post(netType);
}
}


/**
* 分发
*
* @param netType
*/
private void post(NetType netType) {
//所有的注册类
Set<Object> set = networkList.keySet();
for (Object getter : set) {
List<MethodManager> methodManagerList = networkList.get(getter);
if (methodManagerList != null) {
for (MethodManager method : methodManagerList) {
if (method.getClazz().isAssignableFrom(netType.getClass())) {
switch (method.getNetType()) {
case AUTO:
invoke(method, getter, netType);
break;

case WIFI:
if (netType == NetType.WIFI || netType == NetType.NONE)
invoke(method, getter, netType);

break;

case CMNET:
if (netType == NetType.WIFI || netType == NetType.NONE)
invoke(method, getter, netType);
break;

case CMWAP:
if (netType == NetType.WIFI || netType == NetType.NONE)
invoke(method, getter, netType);
break;

}
}
}
}
}
}

private void invoke(MethodManager method, Object getter, NetType netType) {
Method excute = method.getMethod();
try {
excute.invoke(getter, netType);
} catch (Exception e) {
e.printStackTrace();
}
}

public void registerObserver(Object mContext) {
List<MethodManager> methodList = networkList.get(mContext);
if (methodList == null) {
// 开始添加
methodList = findAnnotationMethod(mContext);
networkList.put(mContext, methodList);
}
}

private List<MethodManager> findAnnotationMethod(Object mContext) {
List<MethodManager> methodManagerList = new ArrayList<>();
// 获取到activity fragment
Class<?> clazz = mContext.getClass();
Method[] methods = clazz.getMethods();

for (Method method : methods) {
Network networkAnnotation = method.getAnnotation(Network.class);
if (networkAnnotation == null) {
continue;
}

// 注解方法校验
Type genericReturnType = method.getGenericReturnType();
if (!"void".equalsIgnoreCase(genericReturnType.toString())) {
Log.e(Constrants.LOG_TAG, "方法不是void");
throw new IllegalArgumentException("方法不是void");
}


Class<?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length != 1) {
throw new IllegalArgumentException(method.getName() + "方法只能有一个参数");
}


MethodManager methodManager = new MethodManager(parameterTypes[0], networkAnnotation.netType(), method);
methodManagerList.add(methodManager);

}
return methodManagerList;
}

public void unRegisterObserver(Object mContext) {
if (!networkList.isEmpty()) {
networkList.remove(mContext);
}
}

public void unRegisterAllObserver() {
if (!networkList.isEmpty()) {
networkList.clear();
}
//注销广播
NetworkManager.getInstance().unRegisterObserver(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,21 +31,23 @@ public NetworkManager() {
*
* @param application
*/
public void init(Application application) {
public NetworkManager init(Application application) {
if (application == null) {
return;
throw new IllegalArgumentException("application is empty");
}
this.application = application;
// 动态广播注册
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Constrants.ANDROID_NET_CHANGE_ACTION);
application.registerReceiver(receiver, intentFilter);

return this;
}


public void setListener(NetChangeObserver listener) {
receiver.setListener(listener);
}
// public void setListener(NetChangeObserver listener) {
// receiver.setListener(listener);
// }

public static NetworkManager getInstance() {
if (instance == null) {
Expand All @@ -67,4 +69,15 @@ public Application getApplication() {
return application;
}

public void registerObserver(Object mContext) {
receiver.registerObserver(mContext);
}

public void unRegisterObserver(Object mContext) {
receiver.unRegisterObserver(mContext);
}

public void unRegisterAllObserver() {
receiver.unRegisterAllObserver();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.sunchen.networkobserver.annotation;

import com.sunchen.networkobserver.type.NetType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* Created by 「孙晨」 on 2019/4/2 22:13.
* <p>
* God bless me only
* <p>
* Network
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Network {
NetType netType() default NetType.AUTO;
}

0 comments on commit 650d8d9

Please sign in to comment.