当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

4.2.3 Service精通

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:26:15

rue; } } return super.onTransact(code, data, reply, flags); } } @Override public IBinder onBind(Intent intent) { return mBinder; }}客户端实现:public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private EditText edit_num; private Button btn_query; private TextView txt_result; private IBinder mIBinder; private ServiceConnection PersonConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { mIBinder = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { mIBinder = service; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindViews(); //绑定远程Service Intent service = new Intent("android.intent.action.IPCService"); service.setPackage("com.jay.ipcserver"); bindService(service, PersonConnection, BIND_AUTO_CREATE); btn_query.setOnClickListener(this); } private void bindViews() { edit_num = (EditText) findViewById(R.id.edit_num); btn_query = (Button) findViewById(R.id.btn_query); txt_result = (TextView) findViewById(R.id.txt_result); } @Override public void onClick(View v) { int num = Integer.parseInt(edit_num.getText().toString()); if (mIBinder == null) { Toast.makeText(this, "未连接服务端或服务端被异常杀死", Toast.LENGTH_SHORT).show(); } else { android.os.Parcel _data = android.os.Parcel.obtain(); android.os.Parcel _reply = android.os.Parcel.obtain(); String _result = null; try{ _data.writeInterfaceToken("IPCService"); _data.writeInt(num); mIBinder.transact(0x001, _data, _reply, 0); _reply.readException(); _result = _reply.readString(); txt_result.setText(_result); edit_num.setText(""); }catch (RemoteException e) { e.printStackTrace(); } finally { _reply.recycle(); _data.recycle(); } } }}运行截图:代码比较简单,就不多解释了~用到自己改改即可!PS:代码参考于:Android aidl Binder框架浅析4.Android 5.0后Service一些要注意的地方:今天在隐式启动Service的时候,遇到这样一个问题然后程序一启动就崩了,后来苦扣良久才发下是Android 5.0惹的祸,原来5.0后有个新的特性,就是:Service Intent must be explitict!好吧,就是不能隐式去启动Service咯,解决的方法也很简单!比如StartService的:startService(new Intent(getApplicationContext(), "com.aaa.xxxserver"));这样写程序直接crash掉,要写成下面这样:startService(new Intent(getApplicationContext(), LoadContactsService.class));如果是BindService的:Intent service = new Intent("android.intent.action.AIDLService");的基础上,要加上包名:service.setPackage("com.jay.ipcserver");这样就可以了~官方文档:http://developer.android.com/intl/zh-cn/guide/components/intents-filters.html#Types文档说明处:本节小结:好的,关于Service的最后一节就到这里,本节讲解了Binder的基本概念以及实现进程间通信的两种方式:通过AIDL以及Binder.onTransact()来实现跨进程通信!最后还讲解了下Android 5.0后使用Service不能隐式启动的注意事项!就到这里,谢谢~

上一页  [1] [2] [3] [4] [5] [6] 


4.2.3 Service精通