可用于不同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. publicclassMyBroadcastextendsBroadcastReceiver{
  2. privatefinalstaticStringACTION="com.lp.MyBroadcast";
  3. @Override
  4. publicvoidonReceive(Contextcontext,Intentintent){
  5. if(intent!=null){
  6. if(ACTION.equals(intent.getAction())){
  7. Toast.makeText(context,intent.getStringExtra("lp"),1).show();
  8. }
  9. }
  10. }
  11. }


xml声明broadcast

Java代码
  1. <receiverandroid:name=".MyBroadcast">
  2. <intent-filter>
  3. <actionandroid:name="com.lp.MyBroadcast"/>
  4. </intent-filter>
  5. </receiver>




2、另一个应用调用
Java代码
  1. privatefinalstaticStringACTION="com.lp.MyBroadcast";
  2. btn.setOnClickListener(newOnClickListener(){
  3. @Override
  4. publicvoidonClick(Viewv){
  5. Intentintent=newIntent();
  6. intent.setAction(ACTION);
  7. intent.putExtra("lp","跨进程调用Broadcast");
  8. sendBroadcast(intent);
  9. }
  10. });

更多相关文章

  1. Android低版本sdk的getSupportedPreviewFrameRates实现
  2. Android(安卓)PopupWindow 弹出菜单
  3. android ndk返回String(字符串)
  4. 启动Activity时的方法调用(应用层)(MVC模式)
  5. Android(安卓)Parcelable代码自动生成插件 Parcelable code gene
  6. android ViewGroup删除子视图时应该注意的一个问题
  7. react-native-vector-icons android 字体图标
  8. 在代码中设置RelativeLayout布局中标签的android:layout_toLeftO
  9. Android之Service组件

随机推荐

  1. 2017年 Web 开发趋势
  2. 超详细!详解一道高频算法题:数组中的第 K
  3. 软件设计原则
  4. 短小精悍,双指针对撞,求解「两数之和 II」
  5. 从零到一学懂区块链(6):哈希函数
  6. (再进阶版)有了四步解题法模板,再也不害怕动
  7. JavaScript 数据结构(2-2):栈与队列-队列篇
  8. 学了那么多公式,却依旧用不好Excel(实例讲
  9. 「图解」缺失的第一个正数
  10. 经验分享:谈谈“面试”