您的位置:首页 > 移动开发 > Android开发

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)));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: