四大组件及dalvik基础
四大组件
Activity
生命周期
四种启动模式
四种模式可以在清单文件的节点下通过android:launchMode来进行配置
- standard模式:在这种模式下,activity默认会进入启动它的activity所属的任务栈中,这也是默认的一种模式
- singleTop模式:栈顶复用模式。如果新acitivty 位于任务的栈顶的时候,activity不会被重新创建,同时它的onNewIntent方法会被回调
- singleTask模式:栈内复用模式。只要activity在一个栈中存在,那么多次启动此activity不会被重新创建单例,系统会回调onNewIntent。这种模式可以称为单例模式,只会存在一种,有则直接从栈中调用,没有则创建并且压入栈中
- singleInstance模式:单实例模式。这种模式的activity只能单独的位于一个任务栈中,这种与singleTask有点类似,其实也是有则直接调用,没有则创建并且放入栈中,只不过singleTask是可以和其他的Activity放在同一个栈中,singleInstance则是只会将创建的Activity放在一个栈中,并且这个栈中只会有这一个Activity实例
Service
通过start方法开启服务
- 创建一个类继承Service
public class MyService extends Service{
public MyService(){
}
@Override
public IBinder onBind(Intent intent){
throw new UnsupportedOperationException("Not yet implemented");
}
}
-
在清单文件中注册这个服务
<service android:name=".MyService" android:enabled="true" android:exported="true"> </service>
-
通过startService方法启动服务
Intent intent = new Intent(this,MyService.class); startService(intent);
-
当不用服务的时候通过stopService()方法停止该服务
stopService(intent);
特点:通过start方法启动的service一旦服务开启就跟调用者(开启者)没有任何关系了,开启者退出了,开启者挂了,服务还在后台长期的运行,开启者不能调用服务里面的方法。
通过bind的方式启动服务
-
创建一个类继承Service
public class MyService extends Service{ public MyService(){ } @Override public IBinder onBind(Intent intent){ throw new UnsupportedOperationException("Not yet implemented"); } }
-
在清单文件中注册这个服务
<service android:name=".MyService" android:enabled="true" android:exported="true"> </service>
-
通过bindService方法启动服务
Intent intent = new Intent(this,MyService.class); bindService(Intent,ServiceConnection,int);
-
当不用服务的时候通过unbindService()方法停止该服务
unbindService(ServiceConnection);
特点:使用bind方法启动的服务,调用者挂了,服务也挂了,调用者可以调用服务中的方法
BroadcastReceiver
无序广播
无序广播是完全异步的,在同一时刻在逻辑上是能够被所有的接收者接收到的,传递的效率高,缺点是接收者不能处理结果传给下个接收者,并且服务终止广播的传播
Context.sendBroadcast()
广播的生命周期就是在处理完onReceive时,系统将认定他不是一个活动的对象了,就是杀掉他,由于广播的生命周期很短,所以不建议在onReceive中执行一些耗时操作
创建一个广播的步骤:
-
创建一个类继承BroadcastReceiver,并且重写其onReceive方法
public class MyBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context,Intent intent){ if(intent.getAction().equals("test")){ } } }
-
在清单文件中注册(静态注册)
<receiver android:name=".broadcast.MyBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> <action android:name="test"/> </intent-filter> </receiver>
或者动态注册
registerReceiver(new MyBroadcastReceiver(),new IntentFilter("test"));
-
加上权限
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
-
发送广播
Intent intent = new Intent("test"); sendBroadcast(intent);
有序广播
ContentProvider
主要的作用是将程序的内部的数据和外部进行共享,为数据提供外部访问接口,被访问的数据主要以数据库的形式存在,而且可以选择共享哪一部分的数据。这样一来,对于程序当中的隐私数据可以不共享,从而更加安全。
dalvik
dalvik字节码
-
dalvik寄存器
32位,64位时使用两个相邻的寄存器存储
-
寄存器的命名法
-
v命名:
- 局部变量寄存器:v0-vn
- 参数寄存器:vn-vn+m
-
p命名:
- 参数寄存器 p0 - pn
- 变量寄存器 v0 - vn
-
-
dex文件反汇编工具
.java编译成.class再编译成.dex 最后反编译得到samli文件
.java -> .class -> .dex -> .samli
-
dx.jar将.class打包成.dex
命令:dx --dex --output=./xxx.class
-
Baksmali.jar将.dex反编译成smali
命令:java -jar baksmali.jar.smali打包成.dex -o smali out/ classes.dex
-
Smali.jar将.smali打包成.dex
命令:java -jar smali.jar smali out/ -o classes.dex
-
-
dalvik字节码类型
Dalvik java B byte C char S short I int J long F float D double Z boolean V void L java 类类型 [ 数组类型 -
字段
字段格式:类型(包名+类名)->字段名称+字段类型
-
方法
Lpackage/name/ObjectName;->MethodName(Ⅲ)Z
(Ⅲ)Z:这部分表示的是方法的签名信息