[置顶] [Android开发]android 跨进程通信之Broadcast
可用于不同apk间进行通信
开机启动一个Service,在Service中做相应的处理。
一个apk要访问另一个apk中Service的引用,需要通过Binder来处理。
如:
--apk1:TelemaService
/**
*
*/
package com.pioneer.TelemaService;
import com.pioneer.Telematics.jni.jniTBOXAdapterControl;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class TelemaService extends Service {
public TelemaService() {
// TODO Auto-generated constructor stub
}
/*
* (non-Javadoc)
* @see android.app.Service#onBind(android.content.Intent)
*/
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return binder;
}
@Override
public void onCreate() {
TelemaServiceLog.i("TelemaService onCreate");
SocketAdpater.instance().startSocket(this);
super.onCreate();
}
@Override
public void onDestroy() {
TelemaServiceLog.i("TelemaService onDestroy");
SocketAdpater.instance().closeSocket();
super.onDestroy();
}
/**
* get jniTBOXAdapterControl instance
*
* @return jniTBOXAdapterControl
*/
public jniTBOXAdapterControl instance() {
return jniTBOXAdapterControl.instance();
}
/**
* bind
*
*/
public class LocalBinder extends Binder {
public TelemaService getService() {
return TelemaService.this; // 返回TelemaService的引用
}
}
private IBinder binder = new LocalBinder();
}
--SocketAdpater:
package com.pioneer.TelemaService;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import android.content.Context;
import android.content.Intent;
public class SocketAdpater extends Thread{
private static SocketAdpater adpater = null;
private Context context = null;
public final String ACTION_NAME = "intent.action.TelemaService.send_data_from_TBox";
private boolean flag = false;
private Socket s = null;
private DataInputStream dis = null;
private Intent intent = null;
private SocketAdpater()
{
}
/**
* Get SocketAdpater's instance
* @param none
* @return SocketAdpater: the reference of SocketAdpater
*/
public static SocketAdpater instance()
{
if(null == adpater)
{
adpater = new SocketAdpater();
}
return adpater;
}
/**
* Start socket
* @param context:use to sending broadcast
* @return none
*/
public void startSocket(Context context)
{
this.flag = true;
this.context = context;
adpater.start();// Start thread
}
@Override
public void run()
{
try
{
StringBuffer buffer = new StringBuffer();
TelemaServiceLog.i("Socket prepare to start");
s = new Socket("10.0.2.2", 1234);
s.setSoTimeout(5000); // Set socket connection timeout time as 5 seconds
while(flag)
{
dis = new DataInputStream(s.getInputStream());
String data = dis.readUTF();
buffer.append(data);
String sTBoxInfoData = buffer.toString();
//"0D05" means message start and "0D0A" means message end
if(sTBoxInfoData.startsWith("0D05") && sTBoxInfoData.endsWith("0D0A"))
{
intent = new Intent(ACTION_NAME);
intent.putExtra("TBoxInfoData", sTBoxInfoData);
context.sendBroadcast(intent);// Send intent to Telematics by broadcast
buffer.delete(0, buffer.length());// Clear the buffer
}
}
}
catch(Exception e)
{
intent = new Intent(ACTION_NAME);
intent.putExtra("TBoxInfoData", "");// Send "" to Telematics when catch exception
context.sendBroadcast(intent);
TelemaServiceLog.e("Error: "+e.toString());
}
}
/**
* Close socket
* @param none
* @return none
*/
public void closeSocket()
{
this.flag = false;
try
{
dis.close(); // Close stream
s.close(); // Close socket connection
}
catch (Exception e)
{
TelemaServiceLog.e(e.toString());
}
}
}
--开机启用TelemaService服务
package com.pioneer.TelemaService;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class OpenDeviceReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
TelemaServiceLog.i("OpenDeviceReceiver");
Intent in = new Intent(context,TelemaService.class);
context.startService(in);
}
}
配置文件如下:
<receiver android:name="OpenDeviceReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
--apk2:Telematics:
package com.pioneer.Telematics.telemaservice.tbox;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class TelemaTBoxDataReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.v("Telematics", "TelemaTBoxDataReceiver");
String sTBoxInfoData = intent.getStringExtra("TBoxInfoData");
if("".equals(sTBoxInfoData))
{
Log.v("Telematics", "Error");
// Send error to UI
}
else
{
Log.v("Telematics", sTBoxInfoData);
// Parser sTBoxInfoData and send successful message to UI
String s = sTBoxInfoData.substring(6);
String cmd = s.substring(0, 8);
if(TBoxDataCommand.TBOX_STATUS_CHANGED_CMD.equals(cmd))
{
String tBoxStatusChangedInfo = s.substring(8,10);
// Send TBox status changed message to UI
}
else if(TBoxDataCommand.TBOX_BUSINESS_CHANGED_CMD.equals(cmd))
{
String tBoxBusinessChangedInfo = s.substring(8,10);
// Send TBox business changed message to UI
}
else if(TBoxDataCommand.WCDMA_UPGRADE_COMPLETED_CMD.equals(cmd))
{
// Send WCDMA upgrade completed message to UI
}
else if(TBoxDataCommand.TBOX_UPGRADE_COMPLETED_CMD.equals(cmd))
{
// Send TBox upgrade completed message to UI
}
else if(TBoxDataCommand.SIGNALLIGHT_DIAGNOSE_MESSAGE_CMD.equals(cmd))
{
// Send signal light diagnose message to UI
}
else
{
// Do nothing
}
}
}
}
配置文件如下:
<receiver android:name="com.pioneer.Telematics.telemaservice.tbox.TelemaTBoxDataReceiver">
<intent-filter>
<action android:name="intent.action.TelemaService.send_data_from_TBox"/> //监测到是这个action,就启动TelemaTBoxDataReceiver。
</intent-filter>
</receiver>
-------------------------------------------------------------------------------------------------------------------------------------------------
1、自定义的broadcast
Java代码
- publicclassMyBroadcastextendsBroadcastReceiver{
- privatefinalstaticStringACTION="com.lp.MyBroadcast";
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- if(intent!=null){
- if(ACTION.equals(intent.getAction())){
- Toast.makeText(context,intent.getStringExtra("lp"),1).show();
- }
- }
- }
- }
public class MyBroadcast extends BroadcastReceiver {private final static String ACTION = "com.lp.MyBroadcast"; @Overridepublic void onReceive(Context context, Intent intent) {if(intent != null){if(ACTION.equals(intent.getAction())){Toast.makeText(context, intent.getStringExtra("lp"), 1).show();}}}}
xml声明broadcast
Java代码
- <receiverandroid:name=".MyBroadcast">
- <intent-filter>
- <actionandroid:name="com.lp.MyBroadcast"/>
- </intent-filter>
- </receiver>
<receiver android:name=".MyBroadcast" ><intent-filter><action android:name="com.lp.MyBroadcast"/></intent-filter></receiver>
2、另一个应用调用
Java代码
- privatefinalstaticStringACTION="com.lp.MyBroadcast";
- btn.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- Intentintent=newIntent();
- intent.setAction(ACTION);
- intent.putExtra("lp","跨进程调用Broadcast");
- sendBroadcast(intent);
- }
- });
更多相关文章
- Android低版本sdk的getSupportedPreviewFrameRates实现
- Android(安卓)PopupWindow 弹出菜单
- android ndk返回String(字符串)
- 启动Activity时的方法调用(应用层)(MVC模式)
- Android(安卓)Parcelable代码自动生成插件 Parcelable code gene
- android ViewGroup删除子视图时应该注意的一个问题
- react-native-vector-icons android 字体图标
- 在代码中设置RelativeLayout布局中标签的android:layout_toLeftO
- Android之Service组件