简介:
Activity可以说是Android中最重要的组件,其承载着显示界面的重任,一个应用需要包含多个Activity,这些Activity构成了一个Activity栈,当前显示在屏幕上可见的Activity位于栈顶,当一个应用的Activity栈中所有的Activity都退出之后,改应用也就结束了。
基本用法:
Activity最基础的用法可以参考之前的文章:
Activity之间数据的交换:
1. 通过Bundle:
在一个Activity中启动另一个Activity时可以通过intent的intent.putExtra()方法来传递一些简单的数据。也可以把数据放在Bundle中,通过intent.putExtras()将Bundle数据传递给另一个Activity。在Bundle中可以放置常见类型的数据以及Parcelable(可序列化)数据等。但是不能传递太过巨大的数据(限制应该在1MB之内),当数据大小超出1MB时会发生闪退,无响应等异常情况。
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("key","value");
intent.putExtras(bundle);
2. 通过startActivityForResult() :
在Activity中启动另一个Activity时不使用startActivity()而是改用startActivityForResult(),同时在最初的Activity中复写onActivityResult()方法用于处理从后一个Activity返回的数据。
FirstActivity.java
Intent intent = new Intent(this, SecondActivity.class);
//通过startActivityForResult()启动另一个Activity,并为其设置请求码,方便进行检验
startActivityForResult(intent,0x11);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//复写onActivityResult()方法用于处理第二个Activity所返回的值
}
SecondActivity.java
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//获取传过来的Intent中的数据
Intent intent = getIntent();
/**
* 进行数据处理
*/
//将处理结果通过setResult()返回给之前的Activity
setResult();
}
}
几个提供的Activity模板基类:
LauncherActivity:
LauncherActivity可以用来制作启动项列表。
public class MyLuacherActivity extends LauncherActivity
String[] listNames= {"第一个启动项","第二个启动项"};
Class<?>[] className = {MainActivity.class, MyPreferenceActivity.class};
{
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
//为该Activity设置Adapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listNames);
setListAdapter(adapter);
}
/**
* 根据所点击的位置来返回不同的Intent,
* @param position
* @return
*/
@Override
protected Intent intentForPosition(int position) {
return new Intent(MyLuacherActivity.this, className[position]);
}
}
PreferenceActivity:
PreferenceActivity配合PreferenceFragment可以用于保存一些设置数据,常用于自动实现SharedPreference保存方式。
- 首先定义多个PreferenceFragment所要用到的布局文件。
- 定义PreferenceActivity所要用到的布局文件
- 通过在PreferenceActivity中加载Fragment进行显示
1. 定义PreferenceFragment的布局文件
在res文件夹下新建xml文件夹:
set_preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!--设置系统铃声-->
<RingtonePreference
android:ringtoneType="all"
android:title="设置铃声"
android:summary="选择铃声"
android:showDefault="true"
android:defaultValue="true"
android:key="ring_key"
android:showSilent="true">
</RingtonePreference>
<!--个人信息保存-->
<PreferenceCategory
android:title="个人信息设置">
<EditTextPreference
android:key="name"
android:title="用户名"/>
<ListPreference
android:key="gender"
android:title="性别"
android:summary="选择您的性别"
android:dialogTitle="ListPreference"
android:entries="@array/gender_name_list"/>
</PreferenceCategory>
<!--系统信息保存-->
<PreferenceCategory
android:title="系统设置">
<CheckBoxPreference
android:key="autoSave"
android:title="自动保存"
android:summaryOn="自动保存:开启"
android:summaryOff="自动保存:关闭"/>
</PreferenceCategory>
</PreferenceScreen>
display_preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:key="light"
android:title="灯光"
android:summary="请选择亮度">
</ListPreference>
<PreferenceCategory
android:title="文字显示">
<SwitchPreference
android:key="autoScroll"
android:title="自动滚屏"
android:summaryOn="自动滚屏:开启"
android:summaryOff="自动滚屏:关闭"
android:defaultValue="true"/>
</PreferenceCategory>
</PreferenceScreen>
2. PreferenceActivity的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<!--第一个选项-->
<header
android:fragment="com.wei.review_activity.MyPreferenceActivity$SetFragment"
android:title="程序选型设置"
android:summary="设置程序相关的选项"
android:icon="@mipmap/ic_launcher"/>
<!--第二个选项-->
<header
android:fragment="com.wei.review_activity.MyPreferenceActivity$DisplayFragment"
android:title="界面选项设置">
<extra
android:name="website"
android:value="www.baidu.com" />
</header>
</preference-headers>
3. 在PreferenceActivity中加载Fragment:
public class MyPreferenceActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 需要重写该方法,根据名字来判断当前的fragment是否可以获取到
* @param fragmentName
* @return
*/
@Override
protected boolean isValidFragment(String fragmentName) {
return true;
}
/**
* 必须重写,加载布局时调用
* @param target
*/
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preference_headers, target);
}
/**
* 定义的SetFragment,用于实现布局的加载
*/
public static class SetFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.set_preferences);
}
}
/**
* 定义的DisplayFragment,用于实现布局的加载
*/
public static class DisplayFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.display_preferences);
//获取从fragment布局中传来的额外信息
String website = getArguments().getString("website");
Toast.makeText(getActivity(), "网站域名"+website, Toast.LENGTH_SHORT);
}
}
}
Activity的启动模式:
Activity有四种不同的启动模式,各有特点:
Standard模式(默认的启动模式):系统每次都会为目标Activity创建一个新的实例,并将其压入当前的Activity栈中,并不会启动新的Task
SingleTop模式:与Standard模式相似,但是当需要启动的目标Activity正处于栈顶时,并不会创建新的Activity实例,而是复用当前的Activity。若目标Activity不在栈顶,则和Standard模式一样。
SingleTask模式:启用该方式启动的Activity在一个Task中只会有一个实例。若是需要启动的目标Activity正处于栈顶,则此时和SingleTop模式一样;若是需要启动的目标Activity在当前的Task中,但是不在栈顶,则会把目标Activity之上的所有Activity都移出Task栈;若是当前的Task中没有目标Activity,则创建一个Activity新实例,并将其置于栈顶。
SingleInstance模式:启用该模式,无论怎么样启动目标Activity,其都只会有一个实例。若是目标Activity不存在,则会创建一个新的Task(Activity的任务栈),然后创建一个Activity实例;若是目标Activity存在,则会将目标Activity所在的Task掉到前台,使得Activity显示出来。
通过Intent Flag来设置Actvity启动模式
通过startActivity时候可以设置intent的Flag属性来设置要启动的Activity的启动模式:
Intent.FLAG_ACTIVITY_NEW_TASK:新启动一个任务栈来启动Activity,通常用于从Service中启动Activity。
Intent.FLAG_ACTIVITY_SINGLE_TOP:与指定launchMode:”singleTop”一样的效果。
Intent.FLAG_ACTIVITY_CLEAR_TOP:与指定launchMode:”singleTask”一样的效果。
Intent.FLAG_ACTIVITY_NO_HISTORY:使用这种方式启动的Activity,在启动其他的Activity之后,自己就会消失,不会保存在栈中。