本节内容
1.开机到点击应用图标的过程
2.创建ActivityThread和Application
3.Activity的加载流程
4.Context上下文的理解
5.实现显式跳转和返回
6.数据传递和回传
7.隐式启动系统服务
8.隐式跳转到其他程序的页面
一、开机到点击应用图标的过程
1.手机开机之后,会启动一个进程管理手机的页面,然后就有一些系统服务。比如(WindowManagerService,ActivityManagerService,CameraService)等。
二、创建ActivityThread和Application
1.一个程序运行起来就是一个进程,但是点开一个应用图标然后执行具体任务的是由线程来实现的。
2.点击图标,就会启动ActivityThread。线程的入口点是main函数,在main函数里面创建ActivityThread。
3.将ActivityThread 对象进行绑定,调用thread.attach(false,startSeq)方法
4.创建仪表类对象 ,管理程序的生命周期
mInstrumentation = new Instrumentation()
5.创建上下文,再创建应用程序,然后回调application的onCreate()方法。
Context ContextImpl appContext =
ContextImpl.createAppContext.makeApplication(true,null)
6.当重写父类的方法时,是否需要调用父类的方法
1.如果父类实现是空的 ,通常不需要调用
2.如果父类有实现,那么通常需要使用super调用一下父类的方法三、Activity的加载流程
1. 在handleLaunchActivity 里面调用 performLaunchActivity,通过这个方法创建上下文
ContextImpl appContext = createBaseContextForActivity(r);
2.创建启动的页面
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
3.将界面和window绑定 ,activity.attach(appContext,window)还有其他参数没写出来
4.调用onCreate()方法布局Activity界面
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
5.在Activity的子类中 通过实现onCreate()方法来对界面进行初始化(UI布局,逻辑初始化)
四、Context上下文的理解
1.Application Activity Service都是有上下文的,上下文其实就是一个运行环境
2.Context提供了访问系统资源的方法 可以理解为就是一个桥梁,连接设备和context应用界面。
3.什么时候用到context呢,看你什么时候需要系统资源,你什么时候需要,那你就什么时候用context。
4.Activity 的Context和applicationContext的区别:
大多数情况下 ,可以相互使用。如果在涉及界面跳转的时候 ,尽量使用activity的context 因为它提供了默认的任务站,而applicationContext没有提供任务站。
5.Activity就是一个独立的页面。实现页面之间的跳转通过Intent类管理。
6.跳转有两种: 1.显式跳转 同一个应用程序不同界面之间的跳转 明确指定从哪个页面切换到哪个页面。2.隐式跳转 :不同程序之间进行界面的跳转 (微信支付 支付宝支付 微信分享),打开系统提供的服务 (相机 拨号 发信息 联系人信息)
五、实现显式跳转和返回
1.给某个按钮设置一个点击事件,然后监听它来实现跳转
mJump.setOnClickListener {
Intent().apply {
}.also {
startActivity(it)
}
}
2.实现返回,可以在跳转后的界面添加一个按钮,并为其设置一个点击事件,一旦它被点击,就结束这个界面。
mBackBtn.setOnClickListener {
//结束当前页面
finish()
}
3.实现返回还有一种方法,就是在AndroidManifest.xml中,给第二个界面添加一个父界面即可。
<activity android:name=".SecondActivity"
android:parentActivityName=".MainActivity">
六、数据传递和回传
1.从一个页面跳转到另一个页面,可以通过intent.putExtra()方法来传递数据,但是只能传递系统默认的基本类型。
intent.putExtra("name","jack")
intent.putExtra("pwd","123")
2.跳转后的页面需要接收传递过来的数据,只需要获取对应的Intent对象。
val name:String= intent.getStringExtra("name")
val password :String=intent.getStringExtra("pwd")
3.一个一个传递会有点麻烦,所以可以创建一个Bundle()对象来管理这些键值对。
val bundle = Bundle()
bundle.putString("name","jack")
bundle.putInt("age",20)
intent.putExtras(bundle)
4.如果用bundle传递数据,那么接收数据也要使用bundle
val bundle = intent.extras
val name = bundle?.getString("name")
val age = bundle?.getInt("age")
5.如果需要有返回值的跳转,那么就需要使用以下代码实现跳转
startActivityForResult(intent,1)
6.回调结果,就使用setResult()方法,以下是不带数据回调
setResult(1)
7.有一个onActivityResult()方法专门用来处理回调的数据
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
//判断是不是我请求的数据 -> requestCode
if(requestCode==1){
//判断处理结果 resultCode
if(resultCode==0){
//成功
Log.v("666","处理成功 : ${data?.getStringExtra("uid")}")
}else{
//失败
Log.v("666","处理失败")
}
}
}
8.如果带数据回调,就使用以下方法
Intent().apply {
putExtra("uid","001")
setResult(0,this)
}
七、隐式启动系统服务
1.跳转到拨打电话,或者是发短信的系统软件
Intent().apply {
//拨打电话
//通过配置文件的意图过滤器来查找我们需要的Activity
//action动作行为
action= Intent.ACTION_DIAL
//data 传递数据,Uri是资源索引
启动拨号界面,将电话号码传递过去,就可以进行跳转
data = Uri.parse("tel:13879122222")
}.also{
startActivity(it)
}
2.发送短信消息
action = Intent.ACTION_VIEW
data = Uri.parse("sms: 这是我的消息")
3.启动相机
action = "android.media.action.IMAGE_CAPTURE"
八、隐式跳转到其他程序的页面
1.在AndroidManifest.xml中添加意图过滤器
<!--添加意图过滤器-->
<intent-filter>
//系统提供的这种行为
<action android:name="android.intent.action.SEND"/>
//可以自己定义action
<action android:name="666.action.balabala"/>
//如果希望外部程序能够启动这个页面,必须设置category为default
<category android:name="android.intent.category.DEFAULT"/>
//如果希望外部启动这个界面的时候 传递数据回来 必须定义数据的格式
<data android:scheme="666"/>
</intent-filter>
2.重新布局一下activity_main.xml页面,添加一个按钮,并给按钮添加一个id叫mGo.然后在MainActivity里面给这个按钮设置一个监听事件,一旦它被点击,就跳转到我们设置的程序页面
mGo.setOnClickListener {
Intent().apply {
action = Intent.ACTION_SEND
data = Uri.pause("666:MyApplication传递过来的数据")
}.also {
startActivity(it)
}
}
3.上面用的是系统的name,也可以使用自己定义的name
action = "666.action.balabala"
4.在SecondActivity里面可以添加以下这段代码,判断数据是否传过来了
val content= intent.data?.schemeSpecificPart
Log.v("666",content)
网友评论