android使用接口和广播传输数据
实现效果图:
效果图很简单,但是我们实现的效果很重要,是在项目里经常使用的技术,可以很好处理数据在不同界面的刷新处理,全局值的传递,多多使用interface和广播,可以让你的项目少做大量的逻辑处理,提高开发的效率
第一:主界面的效果,因为我这是一个测试案例,所以代码写的比较简单,主要是主界面的两个按钮,第一个按钮,点击出现dialogfragment弹框,然后点击第二个按钮跳转到另一个界面,在主界面创建广播,包括广播的接收和代码动态注册广播,动态注册的广播方便管理,在onreceiver方法里,接收发送过来的广播,根据我们接收到的广播消息,来处理我们的功能逻辑。
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button button,button_intent;
private SoundFragment soundFragment;
private CHS_Broad_BroadcastReceiver mCHS_Broad_Receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.CHS_Broad_BroadcastReceiver");
mCHS_Broad_Receiver = new CHS_Broad_BroadcastReceiver();
//注册广播接收
registerReceiver(mCHS_Broad_Receiver,filter);
button = (Button)findViewById(R.id.button);
button_intent= (Button)findViewById(R.id.button_intent);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showDialogFragment();
}
});
button_intent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(),TextActivity.class);
startActivity(intent);
DataStruct.isdialog = false;
}
});
}
private void showDialogFragment() {
if(soundFragment == null){
soundFragment = new SoundFragment();
}
if(!soundFragment.isAdded()){
soundFragment.show(getSupportFragmentManager(),"soundFragment");
}
soundFragment.OnSetOnClickDialogListener(new SoundFragment.SetOnClickDialogListener() {
@Override
public void OnClickDialogListener(int val, boolean isCheck) {
Log.e("TAG","选择了:"+val+"---"+isCheck);
}
});
}
public class CHS_Broad_BroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getExtras().get("msg").toString();
if(msg.equals(DataStruct.BoardCast_BOOTING_SOUND)){
Log.e("TAG","BroadcastReceiver--选2择了:"+msg);
// showDialogFragment(); //出现音源选择弹框
DataStruct.isdialog = true;
}
}
}
@Override
protected void onResume() {
super.onResume();
if(DataStruct.isdialog){
showDialogFragment();
}
}
}
第二个:dialogfragment弹框 这个界面很简单,大家主要学习一下这个类的,interface类的应用,以后我们在很多自定义的控件都可以添加接口,然后在主界面去调用我们创建的接口,这个接口可以处理事件监听和界面的数据交互,非常的简单快捷,而且功能很稳定,学会了接口,让你的项目处理更加简单
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
/**
* Created by Administrator on 2018\11\8 0008.
*/
public class SoundFragment extends DialogFragment {
private final static int MAX_BTN = 4;
private Button[] btn = new Button[MAX_BTN];
private Context mContext;
public interface SetOnClickDialogListener{
void OnClickDialogListener(int val,boolean isCheck);
}
public SetOnClickDialogListener mSetOnClickDialogListener;
public void OnSetOnClickDialogListener(SetOnClickDialogListener listener){
this.mSetOnClickDialogListener = listener;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.sound_fragment,null);
mContext = getActivity();
initView(view);
return view;
}
private void initView(View view) {
btn[0] = (Button)view.findViewById(R.id.button2);
btn[1] = (Button)view.findViewById(R.id.button3);
btn[2] = (Button)view.findViewById(R.id.button4);
btn[3] = (Button)view.findViewById(R.id.button5);
for(int i=0;i<MAX_BTN;i++){
btn[i].setTag(i);
btn[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int val = (int) view.getTag();
if(mSetOnClickDialogListener != null){
mSetOnClickDialogListener.OnClickDialogListener(val,true);
}
getDialog().dismiss(); //去除对话框
}
});
}
}
}
第三个界面:广播发送器,很多同学可能觉得广播发送器很难,其实广播和handler差不多,都是用来发送和接收广播消息的,主界面方法接收,我们这里使用intent来发送广播,把我们的一个参数传递过去,主界面接收参数,然后进行判断
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
/**
* Created by Administrator on 2018\11\8 0008.
*/
public class TextActivity extends Activity {
private Button button6;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_text);
button6 = (Button)findViewById(R.id.button6);
button6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent1=new Intent();
intent1.setAction("android.intent.action.CHS_Broad_BroadcastReceiver");
intent1.putExtra("msg", DataStruct.BoardCast_BOOTING_SOUND);
sendBroadcast(intent1);
finish();
}
});
}
}
第四个:全局的一个类,主要用于临时存储一些全局的临时数据,建议大家养成一个良好的代码习惯,把一些多次用到的变量,数组都放在一个通用类里面进行统一管理。这样做提高的代码的效率和代码可读性,并且有利于项目的后期维护和代码修改
public class DataStruct {
public static final String BoardCast_BOOTING_SOUND="BoardCast_BOOTING_SOUND";
public static boolean isdialog = false; //true表示出现弹框
}
写到这里,基本结束了,我们实现了广播和接口的简单使用的demo,需要灵活运用