当前位置: 代码迷 >> 综合 >> android视图注册BroadcastReceiver和service传递数据实体
  详细解决方案

android视图注册BroadcastReceiver和service传递数据实体

热度:78   发布时间:2023-10-14 21:52:13.0

1.新建BroadcastReceiver类

adb发送模拟按键:

adb shell am broadcast -a com.lolaage.keyEvent --ei com.lolaage.keyEvent.keyCode 320 --ei com.lolaage.keyEvent.KeyEventAction 1

//通过按键广播方式,进行汉/维翻译
public class KeyBoardReceiver  extends BroadcastReceiver {public final static String LOLAAGE_ACTION = "com.lolaage.keyEvent";public final static String LOLAAGE_KEYCODE = "com.lolaage.keyEvent.keyCode";public final static String LOLAAGE_KEYCODE_CODE = "com.lolaage.keyEvent.KeyEventAction";public static final int KEYCODE_AUDIO_RECORD = 320;public static final int KEYCODE_IMP = 323;@Overridepublic void onReceive(Context context, Intent intent) {int key = intent.getIntExtra(LOLAAGE_KEYCODE, -1);int code = intent.getIntExtra(LOLAAGE_KEYCODE_CODE, -1);switch (key){case KEYCODE_AUDIO_RECORD:if(code==0){//按下TranHelper.BtDown("hanyu");}else if(code==1){//抬起TranHelper.BtUp();}break;case KEYCODE_IMP:if(code==0){//按下TranHelper.BtDown("weiyu");}else if(code==1){//抬起TranHelper.BtUp();}break;}}
}
2.新建接口
public interface IBindDo {void MsgToUI();
}
3.新建数据实体,必须继承Parcelable,和实现它的方法。数据实体里有一个HASHMAP。
public class MainViewMsg implements Parcelable {public static final int DIR_RIGHT =0;public static final int DIR_LEFT  =1;private HashMap<String,String> hmContent;public HashMap<String, String> getHmContent() {return hmContent;}public void setHmContent(HashMap<String, String> hmContent) {this.hmContent = hmContent;}private String DateTime;public String getDateTime() {return DateTime;}public void setDateTime(String dateTime) {DateTime = dateTime;}private int direction;public int getDirection() {return direction;}public void setDirection(int direction) {this.direction = direction;}public MainViewMsg() {}public MainViewMsg( HashMap<String, String> hmContent,String DateTime,int direction){this.hmContent = hmContent;this.DateTime=DateTime;this.direction = direction;}//将对象属性进行序列化@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeMap(hmContent);dest.writeString(DateTime);dest.writeInt(direction);}//将对象属性反序列化然后读取出来,注意属性的顺序必须按照序列化属性的顺序protected MainViewMsg(Parcel in) {hmContent=  in.readHashMap(HashMap.class.getClassLoader());DateTime = in.readString();direction = in.readInt();}public static final Creator<MainViewMsg> CREATOR = new Creator<MainViewMsg>() {@Overridepublic MainViewMsg createFromParcel(Parcel in) {return new MainViewMsg(in);}@Overridepublic MainViewMsg[] newArray(int size) {return new MainViewMsg[size];}};@Overridepublic int describeContents() {return 0;}
}
4.新建Service

public class TranslateService extends IntentService {public TranslateService() {super("TranslateService");}private class MyBinder extends Binder implements IBindDo {public void MsgToUI() {MsgTest();}}@Overridepublic IBinder onBind(Intent intent) {return new MyBinder();}@Overridepublic void onCreate() {super.onCreate();}@Overrideprotected void onHandleIntent(Intent intent) {}private void PostToUI(MainViewMsg msg){//发送广播Intent intent=new Intent();intent.putExtra("msg", msg);intent.setAction("TranslateService");sendBroadcast(intent);}private void MsgTest(){HashMap<String, String> tem = new HashMap<>();tem.put(loadConfig.GetKeyValue("TTS1"), "CN");tem.put(loadConfig.GetKeyValue("TTS2"), "US");MainViewMsg msg = new MainViewMsg(tem, DateTimeHelper.GetNow(), MainViewMsg.DIR_LEFT);PostToUI(msg);}
}

5.新建使用静态类:

public class TranHelper {private static IBindDo myBinder;public static IBindDo getMyBinder() {return myBinder;}public static void setMyBinder(IBindDo myBinder) {TranHelper.myBinder = myBinder;}public static void BtMsg() {myBinder.MsgToUI();}
}

6.新建Activity,随便画几个按钮,模拟发送按键,和直接从Service里得到数据实体

一,按钮模拟发送Broadcast

            public void onClick(View v) {Intent intent = new Intent(LOLAAGE_ACTION);intent.putExtra(LOLAAGE_KEYCODE, 320);intent.putExtra(LOLAAGE_KEYCODE_CODE, 0);sendBroadcast(intent);}

二,按钮直接调用Service,获取返回数据实体

            public void onClick(View v) {TranHelper.BtMsg();}

三,开启Broadcast

    MyServiceConn myServiceConn;//开启服务public void Mystartservice() {Intent intent = new Intent(this, TranslateService.class);myServiceConn = new MyServiceConn();//绑定服务(intent对象,绑定服务的监听器,一般为BIND_AUTO_CREATE常量)bindService(intent, myServiceConn, BIND_AUTO_CREATE);}IBindDo myBinder;private class MyServiceConn implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder iBinder) {//iBinder为服务里面onBind()方法返回的对象,myBinder = (IBindDo) iBinder;TranHelper.setMyBinder(myBinder);}@Overridepublic void onServiceDisconnected(ComponentName name) {unregisterReceiver(receiver);}}private KeyBoardReceiver receiver;private void registerKeyBoardReceiver() {receiver = new KeyBoardReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(LOLAAGE_ACTION);registerReceiver(receiver, intentFilter);}

四,开启从Service返回Activity

    private MsgReceiver msgReceiver;private void RegReceiver() {//注册广播接收器msgReceiver = new MsgReceiver();IntentFilter filter = new IntentFilter();filter.addAction("TranslateService");registerReceiver(msgReceiver, filter);}/*** 获取广播数据*/public class MsgReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {MainViewMsg msg=intent.getParcelableExtra("msg");HashMap kk= msg.getHmContent();}}

五,在onCreate里调用:

                    registerKeyBoardReceiver();Mystartservice();RegReceiver();
这样就可以用按钮模拟发送广播,从广播返回数据实体。
  相关解决方案