Android基础----Activity

简介:

Activity可以说是Android中最重要的组件,其承载着显示界面的重任,一个应用需要包含多个Activity,这些Activity构成了一个Activity栈,当前显示在屏幕上可见的Activity位于栈顶,当一个应用的Activity栈中所有的Activity都退出之后,改应用也就结束了。

基本用法:

Activity最基础的用法可以参考之前的文章:

Android中Activity的初步接触(一)

Android中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保存方式。

  1. 首先定义多个PreferenceFragment所要用到的布局文件。
  2. 定义PreferenceActivity所要用到的布局文件
  3. 通过在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之后,自己就会消失,不会保存在栈中。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值