[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代码 复制代码  收藏代码
  1. public class MyBroadcast extends BroadcastReceiver {   
  2.     private final static String ACTION = "com.lp.MyBroadcast";    
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent) {   
  5.         if(intent != null){   
  6.             if(ACTION.equals(intent.getAction())){   
  7.                 Toast.makeText(context, intent.getStringExtra("lp"), 1).show();   
  8.             }   
  9.         }   
  10.     }   
  11.   
  12. }  
public class MyBroadcast extends BroadcastReceiver {
	private final static String ACTION = "com.lp.MyBroadcast"; 
	@Override
	public 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代码 复制代码  收藏代码
  1. <receiver android:name=".MyBroadcast" >   
  2.             <intent-filter>   
  3.                 <action android:name="com.lp.MyBroadcast"/>   
  4.             </intent-filter>   
  5. </receiver>  
<receiver android:name=".MyBroadcast" >
			<intent-filter>
				<action android:name="com.lp.MyBroadcast"/>
			</intent-filter>
</receiver>




2、另一个应用调用
Java代码 复制代码  收藏代码
  1. private final static String ACTION = "com.lp.MyBroadcast";    
  2. btn.setOnClickListener(new OnClickListener() {   
  3.            
  4.         @Override  
  5.         public void onClick(View v) {   
  6.             Intent intent = new Intent();   
  7.             intent.setAction(ACTION);   
  8.             intent.putExtra("lp""跨进程调用Broadcast");   
  9.             sendBroadcast(intent);   
  10.         }   
  11.     });  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值