最近写的一个apk需要在多个activity之间操作使用同一数据,使用intent 以及broadcast都没有application来的方便!
Application类是一个基类,生命周期最长,我们可以继承这个类,重写一些需要用的方法,创建一些数据,那么在Application启动的时候,就会实例化你重写的这个类!
在这个应用程序中的所有activity都可以通过getApplication()获取实例,进行操作。
我重写的一个用来保存全局vector的application,可以在多个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中的Application中声明
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什么的,可以通过Mapplication实例传递主线程activity的handler引用!在另外的activity中通过实例获取handler引用然后就可以handler.sendMessage(msg);
达到在主线程handler message 更新UI或者其它操作!这样还是比较方便的。