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>。当然它也可以用在其他地方。