昨天学了AIDl通信,结果弄了半天都错误
今天发现错误:
1 要在服务端的清单文件里写:
<service android:name=".IRemoteInterferface" android:exported="true" android:process=":remote"> </service>特别注意不要写成了Server:
2修改完这个错,他竟然还报异常:
发现:EditText Result; 之后竟然没有实例化
坑爹啊
3接着
Intent intent=new Intent(); // startService(intent); intent.setComponent(new ComponentName("com.example.gg.myserver","com.example.gg.myserver.IRemoteInterferface")); bindService(intent,conn, Context.BIND_AUTO_CREATE);
当写成intent.setComponent(new ComponentName("cong","cong.IMyAidlInterface"));这样后出现如上错误
最后代码如下:
服务端:
客户端:package com.example.gg.myserver; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; import android.support.annotation.Nullable; import android.util.Log; import android.widget.Toast; import cong.IMyAidlInterface; /** * Created by gg on 2016/10/31. */ public class IRemoteInterferface extends Service { @Nullable @Override public IBinder onBind(Intent intent) { Log.d("1234","连接了"); return iBinder; } private IBinder iBinder= new IMyAidlInterface.Stub() { @Override public int add(int num1, int num2) throws RemoteException { return (num1 + num2); } }; }
package com.example.gg.myclient; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import cong.IMyAidlInterface; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView text; private EditText num1; EditText num2; EditText Result; Button btn; IMyAidlInterface iMyAidl; private ServiceConnection conn=new ServiceConnection() { //绑定上服务的时候 @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { iMyAidl= IMyAidlInterface.Stub.asInterface(iBinder); if(iMyAidl==null) { Log.d("打印","iMyAidl为空"); }else { Log.d("打印","iMyAidl不为空"); } } @Override public void onServiceDisconnected(ComponentName componentName) { //iMyAidl=null; Toast.makeText(MainActivity.this,"123",Toast.LENGTH_SHORT).show(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intiView(); Intent intent=new Intent(); // startService(intent); intent.setComponent(new ComponentName("com.example.gg.myserver","com.example.gg.myserver.IRemoteInterferface")); bindService(intent,conn, Context.BIND_AUTO_CREATE); } private void intiView() { num1= (EditText) findViewById(R.id.num1); num2= (EditText) findViewById(R.id.num2); Result= (EditText) findViewById(R.id.result); btn= (Button) findViewById(R.id.btnAIDL); btn.setOnClickListener(this); } @Override public void onClick(View view) { int n1=Integer.parseInt(num1.getText().toString()); int n2=Integer.parseInt(num2.getText().toString()); try { //调用远程服务 int result= iMyAidl.add(n1,n2); Result.setText(""+result); } catch (RemoteException e) { e.printStackTrace(); Log.d(" 打应",""+e.getMessage()); Result.setText("错了"); } } @Override protected void onDestroy() { super.onDestroy(); //unbindService(conn); } }
5: AIDL要在客户端与服务端都是一样的包名