一、Activity
1、Activity的生命周期
项目 | 状态 |
---|---|
onCreate() | Activity已经被创建完毕 |
onStart() | Activity已经显示在屏幕,但没有得到焦点 |
onResume() | Activity得到焦点,可以与用户交互 |
onPause() | Activity失去焦点,无法再与用户交互,但依然可见 |
onStop() | Activity不可见,进入后台 |
onDestroy() | Activity被销毁 |
onRestart() | Activity从不可见变成可见时会执行此方法 |
默认情况下 ,横竖屏切换, 销毁当前的activity,重新创建一个新的activity
需求:禁用掉横竖屏切换的生命周期 1. 横竖屏写死 android:screenOrientation=“landscape” android:screenOrientation=“portrait”
2、Activity的四种启动模式
-
standard 标准启动模式
点一次,创建一个activity,会创建多个重复的activity。 -
singleTop 单一顶部模式
如果任务栈的栈顶存在这个要开启的activity,不会重新的创建activity,而是复用已经存在的activity。必须在栈顶存在,才不会重复创建。 -
singeTask 单一任务栈,在当前任务栈里面只能有一个实例存在
当开启activity的时候,就去检查在任务栈里面是否有实例已经存在,如果有实例存在就复用这个已经存在的activity,并且把这个activity上面的所有的别的activity都清空,复用这个已经存在的activity。保证整个任务栈里面只有一个实例存在 -
singleInstance启动模式非常特殊, activity会运行在自己的任务栈里面,并且这个任务栈里面只有一个实例存在
如果你要保证一个activity在整个手机操作系统里面只有一个实例存在,使用singleInstance
二、安卓四大组件之Service
1、Service启动方式
- 服务可以被手动关闭,不会重启,但是如果被自动关闭,内存充足就会重启
- 就是默默运行在后台的组件,可以理解为是没有前台的activity,适合用来运行不需要前台界面的代码
服务的两种启动方式:
-
startService:
- 服务被启动之后,跟启动它的组件没有一毛钱关系
- 启动服务的生命周期:onCreate-onStartCommand-onDestroy
- 重复的调用startService会导致onStartCommand被重复调用
-
bindService:
- 跟启动它的组件同生共死
- 绑定服务和解绑服务的生命周期方法:onCreate->onBind->onUnbind->onDestroy
2、aidl跨进程服务通信
支付宝远程服务
- 定义支付宝的服务,在服务中定义pay方法
- 定义中间人对象,把pay方法抽取成接口
- 把抽取出来的接口后缀名改成aidl
- 中间人对象直接继承Stub对象
- 注册这个支付宝服务,定义它的intent-Filter
需要支付的应用
- 把刚才定义好的aidl文件拷贝过来,注意aidl文件所在的包名必须跟原包名一致
- 远程绑定支付宝的服务,通过onServiceConnected方法我们可以拿到中间人对象
- 把中间人对象通过Stub.asInterface方法强转成定义了pay方法的接口
- 调用中间人的pay方法
服务端
清单文件:
<service android:name="com.wj.aidlservice.PayService"
android:enabled="true"
android:exported="true"
android:process=":remote">>
<intent-filter >
//<action android:name="com.wj.aidlservice"/>
<action android:name="com.wj.aidlservices.IPayAidl"/>
<action android:name="com.wj.aidlservice.ICallbackAidl"/>
</intent-filter>
</service>
public class PayService extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("bind方法");
return mIPayAidl.asBinder();;
}
public void print(){
System.out.println("支付了100");
}
}
private IPayAidl mIPayAidl = new ILocationServiceAidl.Stub() {
@Override
public void pay() {
// TODO Auto-generated method stub
print();
}
@Override
public void registerCallBack(ICallbackAidl callback) throws RemoteException {
synchronized (mLock) {
Log.d(TAG, "registerCallBack");
mRemoteCallbackList.register(callback);
}
}
@Override
public void unRegisterCallBack(ICallbackAidl callback) throws RemoteException {
synchronized (mLock) {
Log.d(TAG, "unRegisterCallBack");
mRemoteCallbackList.unregister(callback);
}
}
}
AIDL文件
aidl文件:后缀名IPayAIDL.aidl
package com.wj.aidlservice;
interface IPayAidl {
oneway void pay();
oneway void registerCallBack(ICallbackAidl callback);
oneway void unRegisterCallBack(ICallbackAidl callback);
}
package com.wj.aidlservice;
interface ICallbackAidl {
String getPayNumber()
}
客户端
1. 创建跟远程服务端相同名字相同包名的aidl文件。
2.调用
public class MainActivity extends Activity {
private MyserviceConnection sc = new MyserviceConnection();
private IPayAidl mIPayAidl;
private ICallbackAidl mICallbackAidl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v) {
Intent intent = new Intent("com.wj.aidlservice.IPayAIDL");
intent.setAction("com.lily.lbs.ICallbackAidl");
intent.setPackage("com.wj.aidlservice");
switch (v.getId()) {
case R.id.start:
//启动远程服务
startService(intent);
break;
case R.id.stop:
//停止远程服务
stopService(intent);
break;
case R.id.bind:
//绑定service
bindService(intent, sc, BIND_AUTO_CREATE);
break;
case R.id.unbind:
mIPayAidl.unRegisterCallBack(mICallbackAidl);
//解绑service
unbindService(sc);
case R.id.pay:
try {
//调用aidl服务端aidl向外提供的方法。
mIPayAidl.pay();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
}
class MyserviceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//String className = service.getClass().getName();
//Log.e(TAG, "className: " + className);
//把Ibinder中间人对象强转成publicbusiness
IPayAidl = IPayAidl.Stub.asInterface(service);
if (mIPayAidl == null || !service.isBinderAlive()) {
Log.e(TAG, "Connect AIDL Service failed");
return;
}
//------ 回调 ------
mIPayAidl.registerCallBack(mICallbackAidl = new ICallbackAidl.Stub() {
public String getPayNumber(String payNumber) {
return payNumber;
}
});
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
}