标签:线程 using save android return 通过 不同 ret turn
1、什么是AIDL?
Android Interface Definition Lauguage(android接口描述语言)是一个IDL语言。
2、AIDL的作用?
背景:在android平台 中,一个进程通常不能访问其它进程中的内存区域。所以,他们需要把对象拆分成操作系统能理解的简单形式,以便伪装成对象跨越边界访问。编写这种伪装代码相当的枯燥乏味,好在android为我们提供了AIDL工具可以来做这件事
作用:用来进行进程间通信,有很多人可能就会问到,进程间通信有很多方法,为什么非要用AIDL了?进程间通信的确有很多,如广播、Message,Content Provider。这些是可以进行进程间通信,但是广播是单向,Message只能在同一个进程通信,而不能跨进程通信,Content Provider不是实时的。而AIDL拥有这他们所没有的优点,双向和跨进程通信、实时。
那在什么情况下使用AIDL了?
官方文档介绍:
package com.test.service.aidl; interface Manager{ float add(float num1,float num2); }
写一个实现它的类ManagerImpl.java
package com.test.service.aidl; public class ManagerImpl extends Manager.Stub{ @Override public float add(float num1,float num2){ return num1 + num2; } }
写一个服务类MyService.java
package com.test; import com.test.service.aidl.Manager; import com.test.service.aidl.ManagerImpl; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; public class MyService extends Service{ private Manager.Stub binder; public void onCreate(){ super.onCreate(); binder = new ManagerImpl(); System.out.println("---->onCreate"); Log.e("--->", "---->onCreate"); } public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("---->onStart"); return super.onStartCommand(intent, flags, startId); } //外界要想访问服务,是通过返回的binder访问的 @Override public IBinder onBind(Intent arg0) { return binder; } }
在AndroidMainfest.xml配置资源
android:process=":push"是另外一个进程
<service android:name=".MyService" android:enabled="true" android:exported="true" android:process=":push" > </service>
最后就写测试类了MainActivity.java
package com.test.ui.activity; import com.test.service.aidl.Manager; import com.test.MyService; import com.test.R; import com.test.service.aidl.ManagerImpl; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; public class MainActivity extends Activity { private Manager binder; private EditText etNum1,etNum2; private TextView tvResult; private ServiceConnection serviceConnect = new XmppServiceConnect(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println("---->onCreate1"); init(); } protected void onStart() { super.onStart();
//活动开始时绑定MyService,就会自动调用serviceConnect bindService(new Intent(this, MyService.class), serviceConnect, BIND_AUTO_CREATE); } private void init() { etNum1 = (EditText)findViewById(R.id.etNum1); etNum2 = (EditText)findViewById(R.id.etNum2); tvResult = (TextView)findViewById(R.id.tvResult); } protected void onDestroy() { super.onDestroy(); unbindService(serviceConnect); } public void btn_add_click(View v) throws RemoteException{ float num2 = Float.parseFloat(etNum2.getText().toString()); float num1 = Float.parseFloat(etNum1.getText().toString()); tvResult.setText(binder.add(num1, num2)+""); } private class XmppServiceConnect implements ServiceConnection {
//开始绑定服务时就执行下面的方法 public void onServiceConnected(ComponentName componentName, IBinder iBinder) { binder = Manager.Stub.asInterface(iBinder);//特别注意这里iBinder是服务那边传过来的 } //解绑时才调用 public void onServiceDisconnected(ComponentName componentName) { binder = null; } } }
界面就很简单了,两个EditText,一个TextView和一个Button
恩结束了,如果有错的地方,还希望有人指出来
标签:线程 using save android return 通过 不同 ret turn
原文地址:http://www.cnblogs.com/xiaolonghome/p/6019921.html