Android->ダイナミックロードActivity(Intentを使用せずにActivityを起動)


主な内容:Intentを使用せず、Activityを起動する:宿主Activityを通じて、起動する必要があるActivityライフサイクルを引き継ぎ、目的を達成する;記事では、Java反射メカニズムを使用する可能性があります.
メインコード1:メインプログラムMainActivity extends Activityメインプログラムを通して、ホストActivityを起動する
public void loadActivity(View view) {
    Intent intent = new Intent(this, ProxyActivity.class);
    startActivity(intent);
}

2:ホストActivity,動的ロードが必要なActivityを起動し,ライフサイクルを引き継ぐ
public class ProxyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { Class<?> localClass = SecondActivity.class; //        Constructor<?> localConstructor = localClass .getConstructor(new Class[] {}); //       
            Object instance = localConstructor.newInstance(new Object[] {}); //       

            Method setProxy = localClass.getMethod("setProxy", new Class[] { Activity.class }); //       ;     onCreate      ;    Activity
            setProxy.setAccessible(true); //         
            setProxy.invoke(instance, new Object[] { this }); //     

            Method onCreate = localClass.getDeclaredMethod("onCreate", new Class[] { Bundle.class }); //     ,  onCreate  
            onCreate.setAccessible(true); //         
            onCreate.invoke(instance, new Object[] { new Bundle() }); //   onCreate  
        } catch (Exception e) { e.printStackTrace(); }
    }

}

3:ダイナミックロードが必要なActivityは、BaseActivityを継承する必要があります
public class BaseActivity extends Activity {
    protected Activity mProxyActivity;

    public void setProxy(Activity proxyActivity) { //       ,         
        mProxyActivity = proxyActivity;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // super.onCreate(savedInstanceState);//  :       ,        
    }

    @Override
    public void setContentView(int layoutResID) { //       ,       ;
        if (mProxyActivity != null && mProxyActivity instanceof Activity) {
            mProxyActivity.setContentView(layoutResID);

            mProxyActivity.findViewById(R.id.button).setOnClickListener(
                    new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                            Toast.makeText(mProxyActivity, "Hello!",
                                    Toast.LENGTH_LONG).show();
                        }
                    });
        }
    }

}

4:ターゲットActivity、コードは簡単で、1行です
public class SecondActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.second_layout);
    }

}

2つのレイアウトファイル:->1:activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

    <Button  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:onClick="loadActivity" android:text="    " />

</RelativeLayout>

–>2: second_layout.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

    <Button  android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="     " />

    <TextView  android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="      Activity, 
Manifest.xml "
/>
</RelativeLayout>

補足:http://blog.csdn.net/singwhatiwanna/article/details/22597587
ソースのダウンロード:http://download.csdn.net/detail/angcyo/8770121
ここまで:文章は终わって、もし疑问があるならば:QQ群:274306954あなたの参加を歓迎します.