Activity启动模式
来源:互联网 发布:sql多表查询 编辑:程序博客网 时间:2024/06/16 07:10
------siwuxie095
共4种启动模式:standard singleTop singleTask singleInstance
1、标准启动模式(standard) 也即默认的启动模式
(1)先创建一个项目:LaunchMode,选择API:21 Android 5.0
选择Empty Activity,工程结构目录一览:
(2)先修改activity_main.xml 的布局为LinearLayout,添加 orientation 属性为:vertical
修改TextView的 id 为 tv,添加一个Button,给Button添加一个 textAllCaps 属性为:false
(关闭全部大写)
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.siwuxie095.launchmode.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/tv"/>
<Button
android:textAllCaps="false"
android:text="启动MainActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnStartSelf"/>
</LinearLayout>
(3)MainActivity.java 中,呈现任务栈ID和当前Activity的ID
package com.siwuxie095.launchmode;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivityextends AppCompatActivity {
private TextView tv;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//需要执行强制类型转换
tv= (TextView) findViewById(R.id.tv);
//设置TextView的呈现信息
//任务栈ID和当前Activity的ID(即Activity实例的ID)
//任务栈即一个堆栈,启动的实例都放入栈中,按返回键(后退键)会弹出栈顶实例
//呈现上一个Activity实例,通过这种方式支持返回键(后退键)的导航
tv.setText(String.format("TaskId:\n%d\nCurrentActivityId:\n%s",getTaskId(),toString()));
findViewById(R.id.btnStartSelf).setOnClickListener(new View.OnClickListener() {
@Override
publicvoid onClick(View v) {
//从MainActivity启动自身
startActivity(new Intent(MainActivity.this, MainActivity.class));
}
});
}
}
(4)在AndroidManifest.xml 中设置启动模式,如果没有设置,
即为默认启动模式---标准启动模式
<?xmlversion="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.siwuxie095.launchmode">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:launchMode="standard">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
(5)连续两次点击按钮,发现TaskId不变,而CurrentActivityId变了,
点击一次返回,回到上一个Activity实例,点击三次返回后结束程序
回到桌面,运行一览:
2、singleTop启动模式
(1)直接修改AndroidManifest.xml 的启动模式为 singleTop
android:launchMode="singleTop"
(2)运行后,点击"启动MainActivity",发现TaskId和CurrentActivityId都没有变化,
点击返回直接结束程序回到桌面,看似Activity只能启动一次,一览:
(3)再new一个Empty Activity:BAty,此时工程结构目录一览:
(4)在 AndroidManifest.xml 中,同样将
BAty启动模式设置为singleTop,为 activity_main.xml 添加一个Button
用于启动BAty,将activity_main.xml完全复制到activity_baty.xml
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.siwuxie095.launchmode.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/tv"/>
<Button
android:textAllCaps="false"
android:text="启动MainActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnStartSelf"/>
<Button
android:textAllCaps="false"
android:text="启动B Activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnStartBAty"/>
</LinearLayout>
(5)同样,在MainActivity.java中做略微修改,复制到Baty.java中,再做略微修改
MainActivity.java:
package com.siwuxie095.launchmode;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivityextends AppCompatActivity {
private TextView tv;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//需要执行强制类型转换
tv= (TextView) findViewById(R.id.tv);
//设置TextView的呈现信息
//任务栈ID和当前Activity的ID(即Activity实例的ID)
//任务栈即一个堆栈,启动的实例都放入栈中,按返回键(后退键)会弹出栈顶实例
//呈现上一个Activity实例,通过这种方式支持返回键(后退键)的导航
tv.setText(String.format("A:\nTaskId:\n%d\nCurrentActivityId:\n%s",getTaskId(),toString()));
findViewById(R.id.btnStartSelf).setOnClickListener(new View.OnClickListener() {
@Override
publicvoid onClick(View v) {
//从MainActivity启动自身
startActivity(new Intent(MainActivity.this, MainActivity.class));
}
});
findViewById(R.id.btnStartBAty).setOnClickListener(new View.OnClickListener() {
@Override
publicvoid onClick(View v) {
startActivity(new Intent(MainActivity.this, BAty.class));
}
});
}
}
BAty.java:
package com.siwuxie095.launchmode;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class BAtyextends AppCompatActivity {
private TextView tv;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_baty);
//需要执行一个强制类型转换
tv= (TextView) findViewById(R.id.tv);
tv.setText(String.format("B:\nTaskId:\n%d\nCurrentActivityId:\n%s",getTaskId(),toString()));
findViewById(R.id.btnStartSelf).setOnClickListener(new View.OnClickListener() {
@Override
publicvoid onClick(View v) {
startActivity(new Intent(BAty.this, MainActivity.class));
}
});
findViewById(R.id.btnStartBAty).setOnClickListener(new View.OnClickListener() {
@Override
publicvoid onClick(View v) {
//从BAty启动自身
startActivity(new Intent(BAty.this, BAty.class));
}
});
}
}
(6)运行后发现,只点击"启动MainActivity",任务栈和实例的ID依然没有变化,
此时点击"启动B Activity",再点击"启动MainActivity",任务栈没变,但实例ID已经变了
(点击三次返回才会结束程序回到桌面)
即:在同一个栈中,指明启动模式为singleTop,若一个Activity处于栈顶,那么只能创建一个实例
,若不处于栈顶才会创建新的实例,一览:
3、singleTask启动模式
(1)先修改AndroidManifest.xml 中的 launchMode 为 singleTask,直接运行,
只点击"启动MainActivity",任务栈和实例ID没有变化,点击"启动B Activity",再点击
"启动MainActivity",任务栈和实例ID依然没有变,点击一次返回就结束程序回到桌面,
即此时任务栈中只剩下了MainActivity,BAty已经在最后一次点击"启动MainActivity"时
就被弹出任务栈,一览:
4、singleInstance启动模式
(1)先修改AndroidManifest.xml 中的 launchMode 为 singleInstance,直接运行,
只点击"启动MainActivity",任务栈和实例ID没有变化,点击"启动B Activity",TaskId 加1,
即任务栈和实例ID都变了,再点击"启动MainActivity",又回到第一次启动MainActivity时的
任务栈和实例ID,即没变,再点击"启动B Activity",同样回到第一次启动BAty时的任务栈和
实例ID,也没变,即独立的任务栈只放一个实例,一览:
【made by siwuxie095】
- android Activity启动模式
- Android Activity启动模式
- activity启动模式详解
- Activity启动模式1
- activity的启动模式
- Activity有四种启动模式
- Activity启动模式
- activity启动模式分析
- Activity的启动模式
- Activity 启动模式
- Activity启动模式
- Activity的启动模式
- Activity 启动模式
- Activity启动模式总结
- Activity的启动模式
- Activity的启动模式
- Activity 启动模式
- Activity启动模式
- poj 2443 状态压缩 叉姐的魔法训练
- 100分求一简单思路
- 后台数据库操作(Python)
- [Leetcode] 41. First Missing Positive 解题报告
- HTML 颜色名
- Activity启动模式
- jedis操作set数据结构总结
- 查找字符的位置
- maven的中央(central)仓库的镜像地址
- android_24_下载图片2_SmartImageView
- 发发牢骚
- HTML 拾色器
- 利用mii-tool或者ethtool查看和设置网卡工作模式
- 实现整形数组的选择排序