ActivityGroup的浅薄理解

来源:互联网 发布:装修材料演示软件 编辑:程序博客网 时间:2024/04/29 07:59

用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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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对象调用的。








原创粉丝点击