Android四大组件


一、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
 
        }       
    }   
 }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值