futabooo blog

色々手をつけすぎてすぐに忘れるので備忘録

AndroidManifestのapplicationタグにクラスを2つ指定したくなった時にやったこと

もともとActiveAndroidを使っていたので下記のようなManifestでした。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.nilab.dribbbleviewer" >

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    
    <application
        android:name="com.activeandroid.app.Application"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

        <meta-data android:name="AA_DB_NAME" android:value="sqlite.db" />
        <meta-data android:name="AA_DB_VERSION" android:value="1" />

        <activity
            android:name="com.nilab.dribbbleviewer.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


ここからVolleyのシングルトンクラスを追加しようと下記クラスを追加(参Android working with Volley Library

package com.nilab.dribbbleviewer;


import android.app.Application;
import android.text.TextUtils;

import com.activeandroid.ActiveAndroid;
import com.activeandroid.Configuration;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;

public class AppController extends Application {

    public static final String TAG = AppController.class.getSimpleName();

    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;

    private static AppController mInstance;

    @Override
    public void onCreate(){
        super.onCreate();
        mInstance = this;
    }

    public static synchronized AppController getInstance(){
        return mInstance;
    }

    public RequestQueue getRequestQueue(){
        if(mRequestQueue == null){
            mRequestQueue = Volley.newRequestQueue(getApplicationContext());
        }
        return mRequestQueue;
    }

    public ImageLoader getImageLoader(){
        getRequestQueue();
        if(mImageLoader == null){
            mImageLoader = new ImageLoader(this.mRequestQueue, new LruBitmapCache());
        }
        return mImageLoader;
    }

    public <T> void addToRequestQueue(Request<T> req, String tag){
        req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
        getRequestQueue().add(req);
    }

    public <T> void addToRequestQueue(Request<T> req) {
        req.setTag(TAG);
        getRequestQueue().add(req);
    }

    public void cancelPendingRequests(Object tag) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }
}

ここから結局ManifestとApplicationクラスを継承したクラスを下記のように書き換えて動きました。
Manifestはapplicationタグの中を書き換え。

    <application
        android:name="com.nilab.dribbbleviewer.AppController"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">

        <activity
            android:name="com.nilab.dribbbleviewer.MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

AppControllerはonCreateの中と新たにメソッドを一つ追加。

public class AppController extends Application {

    @Override
    public void onCreate(){
        super.onCreate();
        Configuration.Builder builder = new Configuration.Builder(getBaseContext());
        builder.setCacheSize(1024*1024*4);
        builder.setDatabaseName("sqlite.db");
        builder.setDatabaseVersion(1);
        ActiveAndroid.initialize(builder.create(), true);

        mInstance = this;
    }

    @Override
    public void onTerminate(){
        super.onTerminate();
        ActiveAndroid.dispose();
    }

以上。
美しくないですね。。。