首先说回调机制,今天在网上看了很多说回调机制的,很多文章写得很绕,我咀嚼了好久才能得出自己的一点理解。下面简要说一下我所理解的回调机制。
通俗地说,假如有两段程序,A和B。A已经封装完毕现阶段不想再改了,但B有一个函数想给A来做,这时候怎么办呢,就需要使用回调机制了。A有一个预留的接口C,B的函数为D。原理如下图:
用简单粗犷的个人理解来说,把B的使用接口C的方法来重写成方法D推给A来完成。
那么,下面就Activity可以使用回调的方法来获取广播的值了。
首先,定义一个基本类A ,BroacdcastReceiver,以及接口C;
public class NetChanceRecive extends BroadcastReceiver {
public CallBackState cbs;
@Override
public void onReceive(Context context, Intent intent) {
cbs= MainActivity.cbs;
if(ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())){
cbs.getState(Util.StateUtil(context));
}
}
public interface CallBackState{
public void getState(int state);
}
}
定义一个判断网络类:
public class Util {
public static int StateUtil(Context context){
ConnectivityManager ctm= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo=ctm.getActiveNetworkInfo();
if (networkInfo!=null) {
if (networkInfo.isConnected()) {
return -1;
}
else if (networkInfo.getType()==ctm.TYPE_WIFI){
return 1;
}
else if (networkInfo.getType()==ctm.TYPE_MOBILE){
return 2;
}
}
return 0;
}
}
定义一个基本类B,重写的方法D:
public class MainActivity extends Activity implements NetChanceRecive.CallBackState{
private int state;
public static NetChanceRecive.CallBackState cbs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cbs=this;
}
@Override
public void getState(int state) {
this.state=state;
Toast.makeText(MainActivity.this,"======"+state,Toast.LENGTH_LONG).show();
}
}
广播注册及权限注册:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.activity" >
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
>
<activity
android:name="com.example.administrator.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.onrecive.NetChanceRecive">
<intent-filter>
<action android:name="android.net.conn.CONNETIVITY_CHANGE">
</action>
</intent-filter>
</receiver>
</application>
</manifest>
一个使用回调机制的网络实时监听方法就完成了。