|
|
|
|
移动端

YambaApplication类

《Learning Android(中文版)》第8章服务,在本章,我们将动手创建一个服务。这个服务的任务是在后台运行的,获取用户在Twitter上最新的时间轴消息,并更新到应用上。本节为大家介绍YambaApplication类。

作者:李亚舟/任中龙/杜钢译来源:电子工业出版社|2012-07-27 11:28

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


YambaApplication类

首先,我们要在之前的package里再创建一个新的Java类,将这个类命名为YambaApplication,它应该继承框架中的基类Application。

接下来,需要把一些通用的功能代码移动到这个基类中。可以预见的是,程序中有很多部分都会用到连接线上服务器或者读取首选项数据这样的通用功能。

注意,在例8-1中,Application对象里面除了常见的onCreate()方法,还提供了一个onTerimante()的回调方法,用于在application退出时进行一些可能需要的清理工作。虽然在这里我们没有什么需要清理的,但是借机记录一些log信息也不错,方便观察application何时真正退出。我们可以稍后再来扩展这里的功能。

例8-1:YambaApplication.java

  1. package com.marakana.yamba3;  
  2. import winterwell.jtwitter.Twitter;  
  3. import android.app.Application;  
  4. import android.content.SharedPreferences;  
  5. import android.content.SharedPreferences.OnSharedPreferenceChangeListener;  
  6. import android.preference.PreferenceManager;  
  7. import android.text.TextUtils;  
  8. import android.util.Log;  
  9. public class YambaApplication1 extends Application implements  
  10. OnSharedPreferenceChangeListener { //凕  
  11. private static final String TAG = YambaApplication1.class.getSimpleName();  
  12. public Twitter twitter; //凖  
  13. private SharedPreferences prefs;  
  14. @Override  
  15. public void onCreate() { //凗  
  16. super.onCreate();  
  17. this.prefs = PreferenceManager.getDefaultSharedPreferences(this);  
  18. this.prefs.registerOnSharedPreferenceChangeListener(this);  
  19. Log.i(TAG, "onCreated");  
  20. }  
  21. @Override  
  22. public void onTerminate() { //凘  
  23. super.onTerminate();  
  24. Log.i(TAG, "onTerminated");  
  25. }  
  26. public synchronized Twitter getTwitter() { //凙  
  27. if (this.twitter == null) {  
  28. String username = this.prefs.getString("username", "");  
  29. String password = this.prefs.getString("password", "");  
  30. String apiRoot = prefs.getString("apiRoot",  
  31. "http://yamba.marakana.com/api");  
  32. if (!TextUtils.isEmpty(username) && !TextUtils.isEmpty(password)  
  33. && !TextUtils.isEmpty(apiRoot)) {  
  34. this.twitter = new Twitter(username, password);  
  35. this.twitter.setAPIRootUrl(apiRoot);  
  36. }  
  37. }  
  38. return this.twitter;  
  39. }  
  40. public synchronized void onSharedPreferenceChanged(  
  41. SharedPreferences sharedPreferences, String key) { //凚  
  42. this.twitter = null;  
  43. }  

为了让YambaApplication成为一个合法的应用对象,必须让它继承Android框架提供的Application类。注意,我们还把实现OnSharedPreferenceChange-Listener的责任从StatusActivity转交给了YambaApplication。

Twitter和SharedPreferences现在都被放到了这个共享对象里面,而不再放在StatusActivity里面。

onCreate()在应用第一次创建的时候调用。只要应用的任何一个部分或者(比如某个活动或者服务)第一次被请求运行时,都会随之创建。

onTerminate()调用于应用结束之前,在里面可以做些清理工作。在这里我们只用来记录log。

我们也把原先位于StatusActivity中的getTwitter()方法移动到YanbaApplication,因为它会被应用程序的其他部分所调用,而我们则希望尽可能提高代码的重用度。注意这里使用的synchronized关键字,Java中的synchronized方法(http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html)表示此方法在同一时刻只能由一个线程执行。这一点现在尤为重要,因为我们的应用会在不同的线程里用到这个方法。

onSharedPreferenceChanged()也从StatusActivity移动到了YambaApplication。

现在我们已经有了YambaApplication类,也把StatusActivity的一部分责任转移给了这个新类。接下来可以进一步简化StatusActivity,如例8-2所示。

例8-2:StatusActivity using YambaApplication

  1. ...  
  2. Twitter.Status status = ((YambaApplication) getApplication())  
  3. .getTwitter().updateStatus(statuses[0]); //.  
  4. ... 
现在是使用来自YambaApplication的getTwitter()方法,而不再把这个对象保存在StatusActivity内部。像这样,应用程序内的其他代码如果需要访问网络服务,也可以方便地重用这个通用方法。
【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Java程序设计专家门诊

精选目前国内外最流行的程序设计语言——Java作为本书的选题,并以丰富的内容来解决读者学习该语言时可能遇到的各种问题。以专业的论坛为基...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊