可用于不同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
- 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();
- }
- }
- }
- }
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
- <receiver android:name=".MyBroadcast" >
- <intent-filter>
- <action android:name="com.lp.MyBroadcast"/>
- </intent-filter>
- </receiver>
<receiver android:name=".MyBroadcast" >
<intent-filter>
<action android:name="com.lp.MyBroadcast"/>
</intent-filter>
</receiver>
2、另一个应用调用
- private final static String ACTION = "com.lp.MyBroadcast";
- btn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent();
- intent.setAction(ACTION);
- intent.putExtra("lp", "跨进程调用Broadcast");
- sendBroadcast(intent);
- }
- });