1.生明周期
onCreate->onStart->onResume->onPause->onStop->onDestroy
注意:当启动dialog或者dialog样式的activity的时候,之前的activity走onPause不会走onStop方法
2.启动模式
- standard 被启动不管是否存在栈空间重新创建实例
- singleTop 被启动只有当处于栈顶才会被重用,其他时候会创建实例
- singleTask 被启动栈顶直接重用,不在栈顶处在这个activity上面的依次出栈然后重用,只要存在就不会创建实例
- singleInstance 被启动会进入一个新的任务栈
3.启动-显示启动
启动的activity的方法最好定义在被启动的页面里边,并且声明好参数
companion object{
fun actionStart(context:Context,param1:Int,param2:String){
var intent=Intent(context,OtherActivity::class.java)
intent.putExtra("param1",param1)
intent.putExtra("param2",param2)
context.startActivity(intent)
}
}
companion object使用这个可以静态方法那样调用,但是actionStart 并不是真正的静态方法,内部只是创建了一个伴生类来实现这个调用的。如果想成为真正的静态方法需要添加@JvmStatic 这个注解。
需要下一个页面的返回值
var intent=Intent(this,OtherActivity::class.java)
intent.putExtra("param1",param1)
intent.putExtra("param2",param2)
startActivityForResult(intent,requestCode)
将数据传递回去
intent.putExtra("result",result)
setResult(RESULT_OK,intent)
finish()
在这里处理结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode!=RESULT_OK){
return
}
when(requestCode){
REQUEST_CODE_1-> doAction
REQUEST_CODE_2-> doAction
}
}
4.隐式启动
启动一个网页
var intent=Intent(Intent.ACTION_VIEW)
intent.data= Uri.parse("https://baidu.com")
startActivity(intent)
我们自己的acitivity 也可以接这样的意图
<activity android:name=".OtherActivity" >
<intent-filter tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
<data android:scheme="https"/>
</intent-filter>
</activity>
通过data指定协议就可以
5.安全退出应用程序
object ActivityManager {
private val activityList=ArrayList<Activity>()
fun addActivity(activity: Activity){
activityList.add(activity)
}
fun removeActivity(activity: Activity){
activityList.remove(activity)
}
fun finishAll(){
for (activity in activityList){
if (activity.isFinishing){
activity.finish()
}
}
activityList.clear()
}
}
创建单例用于管理启动的Activity,定义删除所有Activity 的方法finishAll
open class BaseActivity :AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("BaseActivity",javaClass.simpleName)
ActivityManager.addActivity(this)
}
override fun onDestroy() {
super.onDestroy()
ActivityManager.removeActivity(this)
}
}
-
定义基类用于,让其他所有的activity都实现这个,就能方便的管理Activity
-
Log.d(“BaseActivity”,javaClass.simpleName) 注意这个非常有用,当一个新的项目,不熟悉的时候加上这个启动应用程序可以清楚的看到页面启动了那个页面,便于定位功能属于哪个页面。
ActivityManager.finishAll()
android.os.Process.killProcess(android.os.Process.myPid())
退出应用的时候只需要调用这个就可以了。注意killProcess这里只能杀死本应用进程,不能杀死另外一个进程。
ProgressBar 这个view是原生的进度,可以设置style="?android:attr/progressBarStyleHorizontal" 来变成横向的。
6.异常退出,数据的持久化
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("data1","数据持久化在这里")
outState.putString("data2","哈哈")
outState.putString("data3","从onCreate的bundle中读取")
}
当异常退出的时候,会执行这个方法,就可以在这个方法中持久化数据了
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState!=null){
val data1 = savedInstanceState.getString("data1")
val data2 = savedInstanceState.getString("data2")
val data3 = savedInstanceState.getString("data3")
Log.d(TAG,"data1=$data1 data2=$data2 data3=$data3")
}
}
下次启动这个页面的时候就可以拿到持久化数据了