Acitivity子类AliasActivity简介和使用

1.AliasActivity的简介

         AliasActivity,即存根Activity,根据组件自己manifest文件中的meta-data的信息启动另一个指定的Activity,并且finish自身。说到这里先看看源码,这里仅仅提供onCreate()方法:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        XmlResourceParser parser = null;
        try {
            ActivityInfo ai = getPackageManager().getActivityInfo(
                    getComponentName(), PackageManager.GET_META_DATA);
            parser = ai.loadXmlMetaData(getPackageManager(),
                    ALIAS_META_DATA);
            if (parser == null) {
                throw new RuntimeException("Alias requires a meta-data field "
                        + ALIAS_META_DATA);
            }
            
            Intent intent = parseAlias(parser);
            if (intent == null) {
                throw new RuntimeException(
                        "No <intent> tag found in alias description");
            }
            
            startActivity(intent);
            finish();
            
        } catch (PackageManager.NameNotFoundException e) {
            throw new RuntimeException("Error parsing alias", e);
        } catch (XmlPullParserException e) {
            throw new RuntimeException("Error parsing alias", e);
        } catch (IOException e) {
            throw new RuntimeException("Error parsing alias", e);
        } finally {
            if (parser != null) parser.close();
        }
    }

       从源码中可以看到,AliasActivity在其onCreate()方法中,调用startActivity()方法启动一个Activity,而且调用finish()方法结束自己,而直接跳生命周期的onDestory()方法。由此可见AliasActivity其实就是在启动自己时直接跳转到Intent中指定的Activity,而自身并没为用户所见。其为实现别名化Activity的简单途径。

2.AliasActivity的使用

         在源码中有这样一段注释,即表示使用AliasActivity,要在manifest中应包括相关组件名为“android.app.alias”的信息,它指的是在XML资源文件中描述的指定启动的真正的应用程序。

         此源码中的注释如下:

/**
 * Stub activity that launches another activity (and then finishes itself)
 * based on information in its component's manifest meta-data.  This is a
 * simple way to implement an alias-like mechanism.
 * 
 * To use this activity, you should include in the manifest for the associated
 * component an entry named "android.app.alias".  It is a reference to an XML
 * resource describing an intent that launches the real application.
 */

         这个描述好像不是太明白,那么直接动手练练:

         先定义一个MainAcitvity,其extends Acitivity如下:

package com.zy.aliasactivitydemo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

        然后建一个DemoAliasActivity,其extends AliasActivity,直接继承父类的onCreate(),如下:

package com.zy.aliasactivitydemo;

import android.app.AliasActivity;
import android.os.Bundle;

public class DemoAliasActivity extends AliasActivity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	}
	
}

        接着就在AndoridManifest.xml中注册了:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zy.aliasactivitydemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.zy.aliasactivitydemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
				<action android:name="android.alis.action.STARTMAIN"/>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
         <activity
            android:name="com.zy.aliasactivitydemo.DemoAliasActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
             
            <meta-data android:name="android.app.alias"
                android:resource="@xml/alias"/>
            
        </activity>
    </application>

</manifest>

        这里需要注意<meta-data android:name="android.app.alias" android:resource="@xml/alias"/>,其定义一个meta-data元素且名字为android.app.alias,其资源为一个xml文件,该文件名为alais.xml,下面就直接展示此文件:

<?xml version="1.0" encoding="utf-8"?>
<alias xmlns:android="http://schemas.android.com/apk/res/android">
    
    <intent android:action="android.alis.action.STARTMAIN"
        android:targetPackage="com.zy.aliasactivitydemo"
        android:targetClass="com.zy.aliasactivitydemo.MainActivity"/>
    
</alias>

       看看这个文件中的定义的为一个alias元素,其中定义了一个intent,intent指定了action、targetPackage、targetClass,当然还可以增加其他。

        该程序运行后,在Launcher中会用两个App Icon,一个为MainActivity,另一个为DemoAliasActivity。那么点击MainActivity后直接就进入MainActivity,而点击DemoAliasActivity的Icon后,也会进入到MainActivity。

      

总结:由上例可以看出AliasActivity可以用来实现Activity别名化,如上例中从用户角度相当于给MainActivity定义了另一别名DemoAliasActivity,即相当与<activity-alias>。当然它也可以用在其他地方。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值