1.android的四种启动模式分别是:standard,singleTop,SingleTask,singleInstance. 我们可以在AndroidMainfest.xml中通过Activity标签指定其启动模式:android:lanunchMode。

2.standard模式

是活动默认的启动模式,该模式,每启动一次都活创建一个活动的实例。

由Activity1跳转到Activity2,Activity2跳转到Activity3,activity3再跳转到activity1.打印出activity1的标示:每一次都是重新创建一个活动实例。这时我们启动了4个活动    实例,我们需要点击四次back键才能退出程序。

3.SingleTop模式:当当前返回栈顶就是该活动时,则不会再重新创建活动实例。

设置启动模式:

<activity android:name=".MainActivity"
android:launchMode="singleTop">

在activity1中点击事件中加入代码:

Intent intent=new Intent(MainActivity.this,MainActivity.class);
startActivity(intent);

我们在OnGeate中的打印的标示,只会打印出一次,再点击跳转后,并没有启动创建activity1的实例。

4.SIngleTask模式:

每次活动启动时,都会在返回栈中检测该活动是否已存在实例,如果存在则会把该实例对象上面所有的活动统统出栈。否则则创建实例对象。

5.SingleInstance模式:

指定为SingleInstance的活动,会启用一个新的返回栈来管理该活动。其解决的主要问题是:当一个活动,允许其他的程序调用时,而每一个应用程序都会有自己的返回栈,同一个活动则会在不同的返回栈中创建新的实例。如果我们设置为singleInstance模式,则会再同一个返回栈中管理该活动,不论那一个程序访问该活动,都会公用一个返回栈,从而解决了共享活动实例的问题。

设置activity2模式为SingleInstance,点击activity1,跳转到activity2,点击activity2,跳转到activity3.

在每一个活动中打印 getTaskId     Log.i(TAG, "onCreate:MainActivity1TaskID: "+getTaskId());输出结果为:

02-16 21:45:49.686 28520-28520/myapplication.com.mylunchmode I/MainActivity: onCreate:MainActivity1TaskID: 13
02-16 21:45:51.326 28520-28520/myapplication.com.mylunchmode I/Main2Activity: onCreate:Main2Activity1TaskID: 14
02-16 21:45:55.216 28520-28520/myapplication.com.mylunchmode I/Main3Activity: onCreate:Main3Activity1TaskID: 13

可以看出,SingleInstance模式的activity2和1,3并不在一个返回栈中。

跳转到activity3时,点击back键,这时并不会回到activity2了,而是直接回到了activity1.

6.活动的知晓:

如何判断当前是哪一个活动?

我们可以写一个BaseActivity,继承于AppcompatActivity。并重写onGreate方法,在方法中加入:Logi(“当前activity:”,getClass.getSimpleName).

然后所有的activity继承BaseActivity,那么就可以打印出当前activity的名称了。

7.活动的管理:

我们可以创建一个活动管理器:

class ActivityCollector{

public static List<actiVity>activitys=new ArrayList<>();

public static void addActivity(Activity activity){

activitys.add(activity);

}

public static void removeActivity(Activity activity){

 activitys.remove(activity);

}

public static void finishAll(){

for(Activity activity:activitys){

if(!activity.isFinishing){

activity.finish();

}

}

}

}

然后我们在BaseActivity中的OnGreate中加入:ActivityCollector.addActivity(this);在onDestroy中加入ActivityCollector.reomveActivity(this);

所有的活动继承BaseActivity即可,当需要在某处退出程序时,可以使用ActivityCollector.finishAll();

8:启动一个活动最佳的写法

如果需要启动activity2:则可以在mianactivity2中加入方法:

参数为:Context,传入参数1,传入参数2

public static void actionStart(Context context, String data1, String data2){

    Intent intent=new Intent(context,Main2Activity.class);
intent.putExtra("param1",data1);
intent.putExtra("param2",data2);
context.startActivity(intent);
}

在activity1中只需要写:Main2Activity.actionStart(MainActivity.this,"数据1","数据2");即可跳转到mainacitivity2,写法简单,便于理解。

 8.生命周期


  <activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<1>  启动activity                                 onCreate 被执行了!  onStart 被执行了!                         onResume 被执行了!

点击back退出:                             onPause 被执行了!   onStop 被执行了!                         onDestroy 被执行了!

点击跳转进入MainActivity2            onPause 被执行了!   onSaveInstanceState 被执行了!    onStop 被执行了!

点击返回再次进入activity                onRestart 被执行了! onStart 被执行了!                        onResume 被执行了!

   点击home键                                   onPause 被执行了!  onSaveInstanceState 被执行了!     onStop 被执行了!

从home键再次显示                         onRestart 被执行了! onStart 被执行了!                         onResume 被执行了!

<2>转换成横屏:

  onPause 被执行了!

  onSaveInstanceState 被执行了!
   onStop 被执行了!
   onDestroy 被执行了!
   onCreate 被执行了!
   onStart 被执行了!
   onResume 被执行了!

在换成竖屏:

  onPause 被执行了!
    onSaveInstanceState 被执行了!
  onStop 被执行了!
  onDestroy 被执行了!
  onCreate 被执行了!
  onStart 被执行了!
  onResume 被执行了!


  <activity android:name=".MainActivity"  android:configChanges="orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<1>启动后转换横屏:

  onConfigurationChanged 被执行了!
  onPause 被执行了!
  onSaveInstanceState 被执行了!
  onStop 被执行了!
  onDestroy 被执行了!
  onCreate 被执行了!
  onStart 被执行了!
  onResume 被执行了!

再次转换成竖屏:

onConfigurationChanged 被执行了!


 <activity android:name=".MainActivity"  android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<1>启动后转换横屏:

   onConfigurationChanged 被执行了!
  onPause 被执行了!
  onSaveInstanceState 被执行了!
  onStop 被执行了!
  onDestroy 被执行了!
  onCreate 被执行了!
  onStart 被执行了!
  onResume 被执行了!

再次转换成竖屏:

onConfigurationChanged 被执行了!

<!-- 看别人的博客说:

加入android:configChanges="orientation|keyboardHidden"

切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

    然后亲自试了一试,华为5.1系统,并不如别人所说的那样  ,或许还需要设置什么,过天在找找

-->


 <activity android:name=".MainActivity"  android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<1>切换横屏:

    onConfigurationChanged 被执行了!

再切换为竖屏:
    onConfigurationChanged 被执行了!

如此设置边不会再走activity的生命周期,只会执行onConfigurationChanged方法。

这是因为从Android 3.2(API 13)开始,横竖屏切换时不仅orientation会发生变化,screenSize也会跟着发生变化,所以要改成上面那样。android:configChanges=orientation|screenSize 告诉activity,不管是orientation变化还是screenSize变化,都不要重新初始化,都通

过onConfigurationChanged让我自己操作。以上就是不让activity重新初始化,而是自己完成横竖屏切换的自适应操作。

保持屏幕禁止切换:

android:screenOrientation="portrait"  设置为竖屏,且不会切换为横屏。(走正常的生命周期

android:screenOrientation="landscape" 设置为横屏,且不会切换为竖屏。(走正常的生命周期 倒是下面的代码控制横屏的生命周期不一样啦!

代码控制屏幕:

在onCreate里面设置  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

启动activity,呈现界面确实是横屏,且不会切换为竖屏,但是启动时走得方法为:

onCreate
onStart
onResume
onPause
onSaveInstanceState
onStop
onDestroy
onCreate
onStart
onResume

在onCreate里面设置setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

启动activity,呈现界面竖屏,且不会切换为横屏,启动时走得方法(正常生命周期)为:

onCreate
onStart
onResume

 9.活动被回收现象

当一个活动进入停止状态时,是有可能被系统回收的,那么我们如何保存一些数据呢?

重新方法:

    @Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("key","输入你需要保存的value");
}

在onCreate重新获取

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); if(savedInstanceState!=null){
String value=savedInstanceState.getString("key");
}
……
}

Android的Activity的小知识点的更多相关文章

  1. Android开发之实用小知识点汇总-2

    1.EditText 中将光标移到文字末尾: EditText mEdit = (EditText)this.findViewById(R.id.EditText01); mEdit .setText ...

  2. Android开发之实用小知识点汇总-1

    1.去掉android屏幕中的actionbar: this.requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏 //这个是全屏幕显示的代码 ...

  3. Android 绘制view的小知识点

    [onMeasure] 直接继承view或ViewGroup的自定义控件需要重写onMeasure方法并设置wrap_content时的自身大小,否则在布局中使用wrap_content就相当于mat ...

  4. Android 程序申请权限小知识点

    在Google Play 应用商店,显示至少支持设备的数量时候会用到权限数量.其他地方用处不大. Android系统提供为程序提供了权限申请,即在manifest中使用uses-permission来 ...

  5. Android MediaPlayer架构 -- 前言小知识点(一)

    在Android中可以使用MediaPlayer+SurfaceView来实现一个简单的多媒体播放器. 一  构造函数 java MediaPlayer class 的源码位置:frameworks\ ...

  6. Android MediaPlayer架构 -- 前言小知识点(二)

    本文系作者自己学习之所用,文章内容仅出自作者拙劣之思考,问题之处烦请不吝指教. 在frameworks\av\media\libmedia\mediaplayer.cpp中会有语句:const sp& ...

  7. android 小知识点

    小知识点总结 1. android中MotionEvent.ACTION_CANCEL事件如何被触发? 对于这个问题,android文档的说明很简短,想看明白很难.国外一网页说的还比较详细,写在这里分 ...

  8. 关于android初学者必须掌握的Activity的四大知识点

    这几天一直都在捣鼓android的知识点,兴趣班的老师,讲课太过深奥,天(想到什么就见什么,后后面完全不想听),最后自己找资料总结了在Android学习中很重要的一个组件Activity,那就开始吧! ...

  9. android 学习随笔二十八(应用小知识点小结 )

    去掉标题栏的方法 第一种:也一般入门的时候经常使用的一种方法requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏注意这句一定要写在setConte ...

随机推荐

  1. RabbitMQ学习之messageconver插件实现(Gson)

    RabbitMQ已经实现了Jackson的消息转换(Jackson2JsonMessageConverter),由于考虑到效率,如下使用Gson实现消息转换. 如下消息的转换类的接口MessageCo ...

  2. 【前端分享】jQuery.lazyload详解(转)

    jQuery实现图片延迟加载,不知道是否可以节省带宽呢?有人知道吗?这究竟只是一个视觉特效还是真的能延迟加载减少服务器的请求呢? <script type="text/javascri ...

  3. python学习小结

    1学习的课程名字叫什么 python:前端初识html,后台基础flask 2怎么输出一句话,用代码举例 输出用:print 例如: 3使用终端工具怎么运行 Python代码 例如我要运行题目2的程序 ...

  4. IDEA使用GsonFormat完成JSON和JavaBean之间的转换

    原文地址:https://www.leshalv.net/posts/12625/ 前言: 之前处理接口传来的一堆数据,用jsonObject很难受,后面就用gosn来弄,配合这个工具体验很好. 转: ...

  5. Python笔记5----集合set

    1.集合的概念:无序不重复 分为可变集合(set())和不可变集合(frozenset)两种 2.创建集合 aset=set('hello') >>aset={'h','e','l','o ...

  6. 【深入理解Java虚拟机】自动内存管理机制——垃圾回收机制

      Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来.C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生 ...

  7. [tyvj 1061] Mobile Service (线性dp 滚动数组)

    3月15日第一题! 题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须 ...

  8. tf.truncated_normal和tf.random_normal使用方法的区别

    1.tf.truncated_normal使用方法 tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=No ...

  9. 【CodeForces 987C】Three displays

    [链接] 我是链接,点我呀:) [题意] [题解] 动态规划 设dp[i][j]表示前i个数字,选了j个的最小花费. dp[i][j] = min(dp[k][j-1]+b[i]);//其中a[i]& ...

  10. centos7.0 安装日志--图文具体解释-python开发环境配置

    centos7.0公布之后,就下载了everthing的DVD镜像.今天有时间,所以决定在vbox底下体验一番--- 上图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...