Android-Applicationグローバル変数アプリケーション


最近書いたapkは複数のactivity間で同じデータを操作する必要があります.intentもbroadcastもアプリケーションがないので便利です.
Applicationクラスは1つのベースクラスで、ライフサイクルが最も長くて、私たちはこのクラスを継承することができて、いくつかの必要な方法を書き直して、いくつかのデータを作成して、それではApplicationが起動する時、あなたが書き直したこのクラスをインスタンス化します!
このアプリケーションのすべてのactivityはgetApplication()でインスタンスを取得し、操作できます.
私が書き直したグローバルvectorを保存するためのアプリケーションは、複数のactivityでbookdataを操作することができます!
public class Mapplication extends Application
{
	private static final String TAG = "Mapplication";
	private Vector<Book>bookdata=new Vector<Book>();
	
	public void onCreate()
	{
		super.onCreate();
		bookdata.clear();
		/*data init*/
       Log.d(TAG, "application create");
	}
	
	public int getbookcount()
	{
		return bookdata.size();
	}
	
	public Vector <Book> getbookdata()
	{
		return bookdata;
	}
	
	public void setbookdata(Vector<Book> bookdata)
	{
		this.bookdata.clear();
		this.bookdata.addAll(bookdata);
	}
	public boolean addbook(Book book)
	{
		String addbookname=book.bookname;
		for(int i=0;i<bookdata.size();i++)
		{
			if(bookdata.get(i).bookname.equals(addbookname))
				return false;
		}
		bookdata.add(book);
		return true;
	}

AndroidManifest.xmlのアプリケーションで宣言 
android:name=“Mapplication”
  <application
        android:name="Mapplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
       android:theme="@style/AppTheme"  >
        <activity 
            android:name="com.jscese.moonread.MoonMainActivity"
            android:label="@string/app_name"
            android:theme="@style/MoonTheme.NoTitleBar" >
            <intent-filter>   
                <action  android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER"  />                            
              </intent-filter>

       </activity>

特に注意したいのは、Mapplication.javaはメインactivityと同じパッケージに入れなければなりません!つまりあなたのアプリケーションのメインパッケージです!さもないと間違いを報告します.
ActivityThread.handleBindApplication(ActivityThread$AppBindData) line: 4400

いずれのactivityでも、(Mapplication)getApplication()を使用してインスタンスオブジェクトを取得できます.
public void init()
	{
		mapplication=(Mapplication) getApplication();
		bookshelf=mapplication.getbookdata();
		if(mapplication.getbookcount()==0)
			withoutbook=true;
	}
@Override
protected void onCreate(Bundle savedInstanceState)
{
	super.onCreate(savedInstanceState);
	setContentView(R.layout.moonmain);
	init();
	findview();
	setlistener();
}

これにより、複数のactivityで同一データをメンテナンスしたり、位相を変えて通信を実現したりすることができる.
UIの更新など、他の通信操作を行う場合は、マスタースレッドactivityのhandlerリファレンスをMapplicationインスタンスで渡すことができます.他のactivityでは、handler参照をインスタンスで取得し、handler.sendMessage(msg)を取得できます.
メインスレッドhandler messageでUIまたはその他の操作を更新します.これはやはり便利です.