複数のActivityを継承したい時に(UnityPlayerActivityProxy) 

#Prime31 SocialNetworkPluginを使おうと思いました、その時です

このプラグインを使うには 呼び出すActivityが com.prime31.UnityPlayerProxyActivityのサブクラスでなければなりません

通常なら AndroidManifestのativityのところを 上記の名前にすればいいのですが
メインのActivityを独自で実装している場合は 出来ません
もちろん、自分のActivityを UnityPlayerProxyActivity から派生させれば問題ないのですが
もし他の Activityを継承する必要のあるプラグインを複数使う場合

Javaでは多重継承が認められていないので、別Activityにするなど 対策しなければなりませんが
コンテンツプロバイダーだったり、異なるActivityにデータを渡すのが面倒だし
Activityが増えると 終了問題など考える事が多くて面倒

##そういう時の為に、Activityを継承せずに、複数のActivityを使える方法が用意されています

[Activity Sharing System](https://gist.github.com/prime31/0908e6100d7e228f1add)

ここを見て 英語がわかればいいのですが、私は英語がよくわからなかったので
ソースを読みました！

##短いソースなのですぐ読めます 記事下の方においてます

要はAndroidManifest のApplicationに 
android:value="UnityPlayerActivityProxy" のmetaタグに、シェアしたいActivity名をいれるようです
（パッケージ名ではなく ActivityのClass名）

```xml:
    <meta-data android:name="com.prime31.FacebookPlugin" android:value="UnityPlayerActivityProxy"/>
    <meta-data android:name="hoge" android:value="UnityPlayerActivityProxy"/>
    <meta-data android:name="hogehoge" android:value="UnityPlayerActivityProxy"/>
```

そして そこに登録されたActivityClassにたいして、リフレクションで OnXX系のメソッドを呼んでます
これで ActivityがShareされたよ！ っていう事ですが
多少不満は残ります


##Activityの方ですが 色々と修正が必要です

まず、 OnXX系のメソッドがリフレクションで呼ばれますが、Classメソッドである必要があるので
OnXX系を全部 Public static メソッドにする必要があります

もちろんstaticメソッドになったので、非staticメソッドにアクセスできませんので工夫してください！

また、Activityをextendする必要がないので extends Activity　を消した方が良いです

よくActivityやcontextを使ってると思いますが、自分はもうActivityではないので
CurrentのActivityを取得しそのメソッドを呼ぶよう変更しなければなりません
UnityPlayer.currentActivity 等を使う事になるでしょう



そんなこんなで、私がだいたい、この変更をした時の 元Activity はこうなります


```java:motoActivity.java
	public class motoActivity {
	
	// ---- for singleton 
	private static motoActivity _instance = new motoActivity();
	
	private motoActivity() { 
	}
	
	// インスタンス取得メソッド
	public static motoActivity getInstance() {
		return _instance;
	}	
	
	private static Activity 	mActivity = UnityPlayer.currentActivity;

	public static void onCreate(Bundle savedInstanceState)
	{
             hoge...
	}
```


#おまけ、Prime31 Activity Shareing Systemのソース

##主要部分抜粋

```java:UnityPlayerNativeActivity.java
public class UnityPlayerNativeActivity extends com.unity3d.player.UnityPlayerNativeActivity
{

    public UnityPlayerNativeActivity()
    {
    }

    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        try
        {
            _proxyHelper = new ActivityProxyObjectHelper(this);
            _proxyHelper.onCreate(savedInstanceState);
        }
        catch(Exception e)
        {
            Log.i("Prime31", (new StringBuilder("Failed to create proxyHelper: ")).append(e.getMessage()).toString());
        }
    }

    protected void onActivityResult(int request, int response, Intent data)
    {
        super.onActivityResult(request, response, data);
        _proxyHelper.onActivityResult(request, response, data);
    }
,,,,,
```

```java:ActivityProxyObjectHelper.java
public class ActivityProxyObjectHelper
{

    public ActivityProxyObjectHelper(Activity context)
    {
        _proxyClasses = new ArrayList();
        _context = context;
    }

    protected void onCreate(Bundle savedInstanceState)
    {
        try
        {
            ApplicationInfo ai = _context.getPackageManager().getApplicationInfo(_context.getPackageName(), 128);
            Bundle bundle = ai.metaData;
            for(Iterator iterator1 = bundle.keySet().iterator(); iterator1.hasNext();)
            {
                String key = (String)iterator1.next();
                try
                {
                    Object bundleValue = bundle.get(key);
                    if(bundleValue instanceof String)
                    {
                        String value = (String)bundleValue;
                        if(value.equalsIgnoreCase("UnityPlayerActivityProxy"))
                            try
                            {
                                Class classObj = Class.forName(key);
                                _proxyClasses.add(classObj);
                                Log.i("Prime31", (new StringBuilder("found Activity proxy class: ")).append(classObj).toString());
                            }
                            catch(ClassNotFoundException e)
                            {
                                Log.e("Prime31", (new StringBuilder("no proxy class found for ")).append(key).toString());
                            }
                    }
                }
                catch(Exception exception1) { }
            }

        }
,,,
```