Android Service绑定、生命周期、传递对象数据
2014-08-21 00:34
639 查看
1.绑定服务
(1)定义一个无参数的接口Interface类
package com.swust.payinterface; import com.swust.bean.Person; interface payInterface { void pay(); //int add(int a,int b); // String sayHello(in Person p); }
(2)修改接口类文件后缀名为aidl (Android Interface Definition Language,即Android接口定义语言)
即payInterface.aidl 修改完成后,gen目录下会生成一个相同的payInterface.java文件(内容不同)(3)创建一个继承与Service的类,重写函数
声明一个继承与Stub的内部类,在onbind函数中返回该类对象。public class PaySerivce extends Service{ @Override public IBinder onBind(Intent intent) {//当服务被绑定的时候调用 // TODO Auto-generated method stub System.out.println("onBind"); return new MyBinder(); } @Override public void onCreate() { // TODO Auto-generated method stub System.out.println("onCreate"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub System.out.println("onStartCommand"); return super.onStartCommand(intent, flags, startId); } private class MyBinder extends Stub{ @Override public void pay() throws RemoteException { // TODO Auto-generated method stub System.out.println("使用支付宝付款"); } /*@Override public int add(int a, int b) throws RemoteException { // TODO Auto-generated method stub return a+b; } @Override public String sayHello(Person p) throws RemoteException { // TODO Auto-generated method stub return "hello"+p.toString(); }*/ } @Override public boolean onUnbind(Intent intent) { // TODO Auto-generated method stub System.out.println("onUnbind"); return super.onUnbind(intent); } @Override public void onDestroy() { // TODO Auto-generated method stub System.out.println("onDestroy"); super.onDestroy(); } }
(4)在主xml中注册Service类
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <service android:name="com.swust.pay.PaySerivce" > <intent-filter > <action android:name="com.swust.PAYSERVICE"/> </intent-filter> </service> </application>
(5)创建新的应用程序
把刚才的接口aidl文件复制一份到src目录下,gen目录也会生成一个同名的java文件。public class MainActivity extends Activity { private Intent intent; private payInterface payinterface; //创建连接对象,重写方法 private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder iBinder) { // TODO Auto-generated method stub payinterface = Stub.asInterface(iBinder);//如果绑定成功,会获取到Service返回的接口对象,在此转换。 } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intent = new Intent("com.swust.PAYSERVICE"); } public void start(View v) throws RemoteException{ startService(intent);//开服务 } public void bind(View v) throws RemoteException{ bindService(intent, conn,BIND_AUTO_CREATE);//绑定服务 } public void invoke(View v) throws RemoteException{ if(payinterface!=null){ payinterface.pay();//调用方法 //System.out.println(payinterface.add(10, 20)); //System.out.println(payinterface.sayHello(new Person("张三", 21))); } } public void unbind(View v) throws RemoteException{ unbindService(conn);//解除绑定 payinterface = null; } public void stop(View v) throws RemoteException{ stopService(intent);//停止服务 } }
2.生命周期
1.如果服务没有开启,
Activity中 执行 startService(intent); 或者 bindService(intent, conn,BIND_AUTO_CREATE);Services 会执行 onCreate() -> onStartCommand(Intent intent, int flags, int startId)
2.如果服务已经开启,
Activity中 执行 startService(intent); Services 会执行 onStartCommand(Intent intent, int flags, int startId);Activity中 执行 bindService(intent, conn,BIND_AUTO_CREATE); Services 会执行 onBind(Intent intent);
3.如果服务开启,再执行绑定后
Activity中 执行 unbindService(conn); Services 会执行 onUnbind(Intent intent)Activity中 执行 stopService(intent); Services 会执行 onDestroy();
4.如果直接进行绑定,不先执行开启服务
Activity中 执行 unbindService(conn);Services 会执行 onUnbind(Intent intent) -> onDestroy();
3.对象数据传递
(1)创建一个类,并接口Parcelable ,重写指定方法
public class Person implements Parcelable{ private String name; private int age; public Person() { super(); // TODO Auto-generated constructor stub } public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub dest.writeString(name); dest.writeInt(age); } public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() { public Person createFromParcel(Parcel in) { return new Person(in.readString(), in.readInt()); } public Person[] newArray(int size) { return new Person[size]; } }; }
(2)创建和类名同名的aidl文件,写入包名和类名
package com.swust.bean; parcelable Person;
(3)在接口类中添加需要的方法
package com.swust.payinterface; import com.swust.bean.Person; interface payInterface { void pay(); int add(int a,int b); String sayHello(in Person p); }
(4)复制要传递数据的类包和之前的接口类到新的应用程序src目录下
(5)新的应用程序 Activity就可以调用该方法,传递数据
public void invoke(View v) throws RemoteException{ if(payinterface!=null){ //payinterface.pay();//调用方法 //System.out.println(payinterface.add(10, 20)); System.out.println(payinterface.sayHello(new Person("张三", 21))); } }
相关文章推荐
- Android服务之Service(四)--ASDL传递复杂数据对象
- Android中级教程(三)之不同Activity之间的数据传递---Bundle对象的使用!
- android之Service介绍之三 AIDL与传递对象
- Android官方推荐全局对象传递数据
- Android中级教程(三)之不同Activity之间的数据传递---Bundle对象的使用!
- Android如何在Activity和Service之间传递数据
- Android笔记 Application对象的使用-数据传递以及内存泄漏问题
- Android官方推荐全局对象传递数据
- Android 将activity中的对象传递到service中
- 初识android--android中按钮事件的绑定和两个activity的数据传递
- 【Android中级教程(三)之不同Activity之间的数据传递---Bundle对象的使用】的改进!
- Android中级教程之(五)----->不同Activity之间的数据传递,Bundle对象的使用!
- Android之Activity的生命周期和Activity间的跳转和数据传递
- android - Application对象的使用-数据传递以及内存泄漏问题
- Android中传递对象数据的方法
- Android之Activity的生命周期和Activity间的跳转和数据传递
- Android 绑定Service 实现android控制service的生命周期
- 初学Android,传递复杂数据的Service(六十一)
- android Service之四:传递复杂数据类型的远程服务
- Android官方推荐全局对象传递数据