用ActivityGroup可以实现多个Activity的切换,ActivityGroup的出现打破了android单窗口管理的理念,但是google在3.0版本后就用新的类来代替它了,这个类叫fragment ,但是现在还是有很多应用都在用ActivityGroup,还是值得了解的。
本例将介绍ActivityGroup+ScrollView来实现TabActivity的页面效果
先来看看主Activity的配置文件:
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="fill_parent"> <LinearLayout android:background="@android:color/black" android:layout_gravity="bottom" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/but1" android:layout_width="150dp" android:layout_height="80dp" android:layout_marginLeft="10dp" android:layout_marginTop="5dp" android:text="第一页" /> <Button android:id="@+id/but2" android:layout_width="150dp" android:layout_height="80dp" android:layout_marginLeft="10dp" android:layout_marginTop="5dp" android:text="第二页" /> <Button android:id="@+id/but3" android:layout_width="150dp" android:layout_height="80dp" android:layout_marginLeft="10dp" android:layout_marginTop="5dp" android:text="第三页" /> </LinearLayout> <ScrollView android:measureAllChildren="true" android:id="@+id/container" android:layout_height="fill_parent" android:layout_width="fill_parent"> </ScrollView> </LinearLayout>
新建一个Activity继承ActivityGroup
ActivityGroupTestActivity.java
package dxd.activitygroup.test; import android.app.ActivityGroup; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ScrollView; public class ActivityGroupTestActivity extends ActivityGroup { ScrollView container ; Button but1 ; Button but2 ; Button but3 ; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); container = (ScrollView)findViewById(R.id.container); container.removeAllViews(); container.addView(getLocalActivityManager().startActivity( "ActivityA", new Intent(ActivityGroupTestActivity.this, ActivityA.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) .getDecorView()); setListener(); } public void setListener(){ but1 = (Button)findViewById(R.id.but1); but2 = (Button)findViewById(R.id.but2); but3 = (Button)findViewById(R.id.but3); but1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { container.removeAllViews(); container.addView(getLocalActivityManager().startActivity( "ActivityA", new Intent(ActivityGroupTestActivity.this, ActivityA.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) .getDecorView()); } }); but2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { container.removeAllViews(); container.addView(getLocalActivityManager().startActivity( "ActivityB", new Intent(ActivityGroupTestActivity.this, ActivityB.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) .getDecorView()); } }); but3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { container.removeAllViews(); container.addView(getLocalActivityManager().startActivity( "ActivityC", new Intent(ActivityGroupTestActivity.this, ActivityC.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) .getDecorView()); } }); } }
到这里主要的代码就完了,其他的Activity文件和对应的布局文件,那就看自己的需求了。别忘在manifest文件中声明者三个Activity哦。
下面来介绍一下,从文档中可以看到ActivityGroup的类继承结构如下:
java.lang.Object ↳ android.content.Context ↳ android.content.ContextWrapper ↳ android.view.ContextThemeWrapper ↳ android.app.Activity ↳ android.app.ActivityGroup
而从文档中可以看出,其共用方法只有两个
getCurrrentActivity():返回一个Activity对象
getLocalActivityManager():返回LocalActivityManger对象,这个类是专门为ActivityGroup设定的,大概就是绕过android的单窗口机制,去直接调用启动Activity的系统线程,这个LocalActivityManager在实现原理上也是值得研究的。
其实在ActivityGroup中主要就是通过getLocalActivitymanager()来获得LocalActivityManager对象,通过这个对象来startActivity !!! 由文档可以查出这个方法:Window startActivity(String id, Intent intent)所以getDecorView()是返回的Window对象调用的。