客户端基础知识-Activity

客户端基础知识-Activity

2022年8月11日,13日-

Android基础组件

1.Activity

Activity是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序可以包含0个或多个Activity。

1.基本用法

创建:

  • 从创建项目开始,这次不选择Empty Activity选项,选择“Add No Activity”。
  • 项目模式手动改为Project模式
  • 在app/src/main/java/com.example.activitytest目录下新建Activity选择Empty Activity,在弹出的对话框中只选择Backwards···
  • 创建和加载布局
  • 在AndroidMainifest文件中注册,所有Activity都需要在这个文件中注册才能生效。Activity的注册声明要放在< application >标签内。
  • 为程序配置主Activity
    任何Activity都需要重写onCreate()方法

Toast

Toast是一种提醒方式,也就是弹窗
使用方法

override fun onCreate(saveInstanceState:Bundle?){
        super.onCreate(savedInstanceState)
        setContentView(R.layout.first_layout)
        val button1:Button=findViewById(R.id.button1)
        button1.setOnclickListener{
                Toast.makeTest(this,"this is a text",Toast.LENGTH_SHORT).show()
        }//第一个参数是Context,表示要求的上下文,Activity本身就是,故可以传入this。第二个是text,第三个是显示时长,可以选择SHORT和LONG。
}

findViewById():获取布局文件中定义的元素,返回的是一个继承自View的泛型对象,但无法确认是什么对象,因此在上边声明为了Button
R.id.button1:得到按钮的实例
setOnclickListener():设置按钮功能
ps:
在Kotlin中引入了一个差距,会根据布局文件中的id自动生成一个相同名称的变量,可以在Activity中直接调用,故上述中的button1的定位可以不用写了,但要使用代码补全,因为自动生成要导包。

Menu

创建菜单
通过android:id给菜单项指定唯一一个标识符
通过android:title给菜单项指定一个名称
回到FirstActivity重写onCreateOptionsMenu()方法,可以使用Ctrl+O快捷键
然后关联指定动作,使用item.itemId来判断点击的是哪一个菜单项。

销毁

只需要按一下Back就可以销毁当前的Activity,或者在按钮关联动作中调用finish()函数。

2.Activity切换

重建一个empty Activity,在本次中除了要勾选上一个backwards选项外还要勾选generate选项。
Intent是Android程序中各组件之间进行交互的一种重要方式,可以指明当前组件想要执行的动作。还可以在不同组件之间传递数据。可用于启动Activity,Service以及发送广播等场景。
可分为显式Intent和隐式Intent。

显式Intent

修改FirstActivity中的事件

button1.setOnClickListener{
        val intent=Intent(this,SecondActivity::class.java)//第一个参数Context要求提供一个启动Activity的上下文,这个this也就是FirstActivity。第二个参数用于指定要启动的目标Activity
        startActivity(intent)//来执行这个Intent
}

隐式Intent

并不明确的指出要启动哪一个Activity,而是指定了一些列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并找出可以响应这个Intent的Activity。
如何设置响应?
在标签下设置的内容,指定可以响应的action和category。只有action和category同时匹配时才能够相应相应的Intent。

<activity android:name=".SecondActivity" >
 <intent-filter>
 <action android:name="com.example.activitytest.ACTION_START" />
 <category android:name="android.intent.category.DEFAULT" />//DEFAULT表示默认的category
 <category android:name="com.example.activitytest.MY_CATEGORY"/>
 </intent-filter>
</activity>

每个intent只能指定一个action,但是可以指定多个category。在firstactivity中

button1.setOnClickListener {
 val intent = Intent("com.example.activitytest.ACTION_START")//指定action,此时用的是默认的category
 intent.addCategory("com.example.activitytest.MY_CATEGORY")//增加category
 startActivity(intent)
}

隐式Intent的其他用法
隐式Intent不仅可以启动自己程序内的Activity,还可以启动其他程序的Activity(便于多个程序之间的功能共享)
修改FirstActivity中的按钮点击代码

button1.setOnClickListener {
 val intent = Intent(Intent.ACTION_VIEW)
 intent.data = Uri.parse("https://www.baidu.com")
 startActivity(intent)
}
  • 启动其他程序
  • 向下一个Activity传递数据
  • 向上一个Activity传递数据

3.Activity的生命周期

Android通过任务来管理Activity。一个任务就是一组存放在栈中的Activity集合,这个栈也被称为返回栈。
Activity的四种状态:

  • 运行态:处于栈顶,系统回收意愿:极低
  • 暂停态:不在栈顶,但依然可见(某些不占据整个屏幕的Activity),是完全存活着的。低
  • 停止态:不在栈顶,且不可见。但系统会保存着某些数据。可能会被回收
  • 销毁态:栈中移除。高(保证手机内存充足)。
    七个方法:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NxhEmL81-1660474792244)(images/2022-08-13-10-12-15.png)]
  • 1.点击一个图标,开始onCreate(此时不可见,不可交互)
  • 2.onStart,此时可见不可交互
  • 3.onResume,此时可以交互了
  • 4.onPause,出现一个小一点的界面,这个界面没有被完全遮挡。此时可见不可交互
  • 5.onStop,出现一个新界面,原来的界面不可见了。
  • 6.onResume,关闭小一点的界面,原来界面回复可交互
  • 7.onStart,关闭新界面,原来的界面恢复可见
  • 8.onDestory,关闭当前界面,关闭Activity。
    如果界面处于不可见的状态下是可能被回收的,此时back的话,不是启用onStart,而是onCreate重建,但是直接这样做会导致数据丢失。因此我们可以使用onSaveInstanceState()方法保存数据,对MainActivity中的Bundle进行检查

4.Activity的启动模式

一共有四种:,分别是standard、singleTop、
singleTask和singleInstance,可以在AndroidManifest.xml中通过给标签指定android:launchMode属性来选择启动模式。

1.standard

该模式下,每启动一个Activity,就会放入栈中,位于栈顶。但并不在乎栈中是否已经存在该Activity。
例:一个Activity已经位于栈顶了,再次启动的时候还会新建立一个新的Activity。

2.singleTop

该模式下,如果启动一个Activity时,会先检查栈顶是否已经存在,如果存在,则不会创建新的实例。但如果没有处在栈顶,再次点击还是会创建新的实例。

3.singleTask

当Activity的启动模式指定为singleTask,每次启动该Activity时,系统首先会在返回栈中检查是否存在该Activity的实例,如果发现已经存在则直接使用该实例,并把在这个Activity之上的所有其他Activity统统出栈,如果没有发现就会创建一个新的Activity实例。
缺点:如果发现需要启动的Activity位于栈中的话,如果尝试启动该Activity的话,会导致栈中该Activity中上边的Activity全部出栈销毁。

4.singleInstance

指定为singleInstance模式的Activity会启用一个新的返回栈来管理这个Activity。
引入理由:每个应用程序都有自己的返回栈。同一Activity在不同的返回栈中入栈时,会创建新的实例。这也就存在共享Activity实例的问题。
特点:会为声明为该模式的Activity设置一个单独的返回栈来管理。

5.实践技巧

1.知道当前界面对应的Activity

  • 1.创建一个普通的Kotlin类baseActivity,继承自AppCompatActivity,设置为open。并重写onCreate()方法。加入日志打印功能。使用javaClass来获取当前实例的Class对象。
  • 2.更改其他所有的Activity,让他们继承自上边baceActivity。
  • 3.运行程序,点击按钮进入不同的界面,就可以知道当前界面 对应的Activity了。

2.一键退出程序

  • 1.新建一个单例类ActivityCollector(用于避免构建重复的对象,比如希望全局最多只有一个实例),使用ArrayList()对所有的Activity进行管理。
  • 2.重写一下各种方法,尤其是finishAll():对当前Activity判断是否正在销毁后进行销毁。
  • 3.在baseActivity的onCreate()方法中对新建立的Activity添加到ArratyList中。重写onDestory()方法,对于要销毁的Activity在链表中移去。
  • 4.在需要一键退出的地方,调用finishAll()函数。也可以再加上杀掉当前进程的代码,确保完全退出。killProcess()方法只能用于杀掉当前程序的进程,不能用于杀掉其他程序。

3.启动Activity

Activity在链表中移去。

  • 4.在需要一键退出的地方,调用finishAll()函数。也可以再加上杀掉当前进程的代码,确保完全退出。killProcess()方法只能用于杀掉当前程序的进程,不能用于杀掉其他程序。

3.启动Activity

对于不知道需要传递多少参数的时候。我们建立一个companion boject{}的语法结构。(在这种结构中的方法都可以使用类似于java静态方法的形式调用)。对于该Activity所需要的所有参数都通过一个actionStart()的方法传递过来。这样就可以非常清晰的知道启动该Activity需要传递哪些数据。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值