版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、鄭州大學(xué)信息工程學(xué)院第21章 Android客戶端程序架構(gòu)點(diǎn)擊添加文本鄭州大學(xué)信息工程學(xué)院21.1 概述 21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”21.3 本章小結(jié)習(xí)題 21本章導(dǎo)讀本章導(dǎo)讀: Android客戶端程序架構(gòu)的設(shè)計(jì)是Android應(yīng)用開發(fā)中非常重要的問題,這里應(yīng)從全局變量的定義和使用、推送的實(shí)現(xiàn)、相對(duì)完整的基礎(chǔ)工具包和核心工具包(類包)的實(shí)現(xiàn)、對(duì)新版本的監(jiān)聽和自動(dòng)下載更新的實(shí)現(xiàn)、捕獲全局異常、后臺(tái)服務(wù)和廣播接收機(jī)制的實(shí)現(xiàn)等諸多方面加以考慮。本章主要知識(shí)點(diǎn)有:(1)Android客戶端程序架構(gòu)的含義和具體內(nèi)容;(2)項(xiàng)目實(shí)戰(zhàn):搭建“掌上蘇大”APP之Android客戶端的整個(gè)程序架構(gòu)。21
2、.1 概述這里“Android客戶端程序架構(gòu)”的含義,是指開發(fā)一個(gè)Android客戶端的應(yīng)用,從全局的角度應(yīng)該考慮哪些問題。 一般來說,一個(gè)Android客戶端應(yīng)用開發(fā),從全局的角度出發(fā),至少應(yīng)該考慮到以下方面的問題。(1)全局變量的定義和使用及全局?jǐn)?shù)據(jù)配置; (2)推送的實(shí)現(xiàn);(3)對(duì)新版本的監(jiān)聽和自動(dòng)下載更新的實(shí)現(xiàn);(4)相對(duì)完整的基礎(chǔ)工具包和核心工具包(類包);(5)對(duì)客戶端各頁面點(diǎn)擊率的統(tǒng)計(jì)及相應(yīng)數(shù)據(jù)分析(對(duì)用戶行為的分析);(6)嵌入廣告的實(shí)現(xiàn);(7)Android使用UncaughtExceptionHandler捕獲全局異常(線程終止異常處理);(8)Android系統(tǒng)賬戶的實(shí)現(xiàn)
3、;(9)整個(gè)應(yīng)用的后臺(tái)服務(wù); (10)流量統(tǒng)計(jì);(11)整個(gè)應(yīng)用的緩存實(shí)現(xiàn);(12)整個(gè)應(yīng)用的內(nèi)存管理以及內(nèi)存泄漏的避免;(13)整個(gè)應(yīng)用的廣播接收機(jī)制;(14)整個(gè)應(yīng)用的并發(fā)設(shè)計(jì)模式。等等。筆者將結(jié)合“掌上蘇大”的開發(fā)實(shí)例,對(duì)Android客戶端應(yīng)用開發(fā)涉及到的從全局角度出發(fā)應(yīng)考慮的問題,談?wù)勛约旱囊恍w會(huì)。21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大” “掌上蘇大”是一款校園客戶端應(yīng)用,致力于服務(wù)蘇州大學(xué)的師生,它的特點(diǎn)是貼近校園生活,包含消息中心、跳蚤市場、勤工儉學(xué)、校園新聞、蘇大周邊、交通查詢、時(shí)事經(jīng)緯、視頻教程、真題庫、考研信息、自考助學(xué)、課程表、個(gè)人中心、網(wǎng)站導(dǎo)航、音樂天地、流量查詢、軟件管理、
4、設(shè)置中心等若干模塊,以及二維碼掃描功能。21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”21.2.1 任務(wù)說明搭建“掌上蘇大”APP之Android客戶端的整個(gè)程序架構(gòu)。21.2.2 整體框架和運(yùn)行主界面我們?cè)贓clipse ADT中一個(gè)創(chuàng)建Android應(yīng)用:palmsuda_demo3工程,palmsuda_demo3工程(源碼)目錄結(jié)構(gòu)、Splash界面、運(yùn)行主界面和退出界面,如圖21-1、圖21-2和圖21-3所示。(詳見教學(xué)資源光盤code文件夾下第21章palmsuda_demo3工程)21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大” 圖21-1 palmsuda_demo3工程(源碼)目錄 圖21-2 閃屏Sp
5、lash 圖21-3 palmsuda_demo3工程主界面和退出界面21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”palmsuda_demo3工程中各個(gè)包的作用是:(1)com.mialab.palmsuda.main:與整個(gè)應(yīng)用及諸模塊相關(guān)的主關(guān)鍵類包。(2)com.mialab.palmsuda.base:基礎(chǔ)類包。主要包括類BaseActivity等。(3)com.mialab.palmsuda.tools.util:核心工具包(核心類包)。包括SD卡文件讀寫、一般通用功能(譬如對(duì)字符串進(jìn)行MD5編碼、判斷網(wǎng)絡(luò)是否連接、檢查服務(wù)器端是否有更新的版本等)實(shí)現(xiàn)、異步獲取網(wǎng)絡(luò)數(shù)據(jù)等等的相關(guān)類。(4)com
6、.mialab.palmsuda.tools.ivache:關(guān)于緩存實(shí)現(xiàn)和異步加載網(wǎng)絡(luò)圖片的核心工具包(核心類包)。這里也涉及到避免內(nèi)存泄漏的問題。(5)mon:通用包。主要包括常量類Constants。(6)com.mialab.palmsuda.modules:主要是與單個(gè)模塊相關(guān)的類包。(7)com.mialab.palmsuda.sercice:與整個(gè)應(yīng)用的后臺(tái)服務(wù)和廣播接收器相關(guān)的類包。(8)com.mialab.palmsuda.syncauth:與Android系統(tǒng)賬戶實(shí)現(xiàn)相關(guān)的類包。(9)com.mialab.palmsuda.views:與自定義視圖及視圖控件相關(guān)的類包。21
7、.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”21.2.3 Android全局對(duì)象ApplicationAndroid系統(tǒng)在運(yùn)行每一個(gè)程序應(yīng)用的時(shí)候,都會(huì)創(chuàng)建一個(gè)Application對(duì)象,用于存儲(chǔ)與整個(gè)應(yīng)用相關(guān)的公共變量。一個(gè)Android應(yīng)用只會(huì)生成一個(gè)Application對(duì)象,在不同的Activity中獲取的Application對(duì)象是一樣的,所以Application對(duì)象是一個(gè)單例(SingleTon)。Application對(duì)象非常適合用于存儲(chǔ)一些與整個(gè)應(yīng)用相關(guān)數(shù)據(jù),例如應(yīng)用版本、應(yīng)用登錄賬戶、數(shù)據(jù)緩存等。所以可以通過繼承Application類來實(shí)現(xiàn)應(yīng)用程序級(jí)的全局變量。在palmsuda_dem
8、o3工程中,我們創(chuàng)建類PalmSudaApp繼承android.app.Application并在AndroidManifest.xml文件中的application標(biāo)簽中進(jìn)行注冊(cè)。PalmSudaApp的onCreate()方法是該整個(gè)應(yīng)用的入口點(diǎn)。主要代碼如下:21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”public class PalmSudaApp extends Application private static final String TAG = Constants.APP_TAG;private static PalmSudaApp app = null;private SharedPr
9、eferences settings;private ServiceManager serviceManager;public static String versionName = ;public static int SCREEN_WEIDTH = 0;public static int SCREEN_HEIGTH = 0;public static PalmSudaApp getInstance() return app;Overridepublic void onCreate() super.onCreate();app = this;Log.d(TAG, This is PalmSu
10、da App.);CrashHandler crashHandler = CrashHandler.getInstance();crashHandler.init(getApplicationContext();settings = getSharedPreferences(APP_SETTING, Application.MODE_PRIVATE);SCREEN_WEIDTH = getResources().getDisplayMetrics().widthPixels;SCREEN_HEIGTH = getResources().getDisplayMetrics().heightPix
11、els;serviceManager = new ServiceManager(this);serviceManager.setNotificationIcon(R.drawable.notification);serviceManager.startService();bindReceiver(20); 21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”21.2.4 整個(gè)應(yīng)用的線程終止異常處理Thread的run方法是不拋出任何檢查型異常(checked exception)的,但是它自身卻可能因?yàn)橐粋€(gè)異常而被終止,導(dǎo)致這個(gè)線程的終結(jié)。最麻煩的是,在線程中拋出的異常即使使用try.catch也無法截獲,因此可
12、能導(dǎo)致一些問題出現(xiàn),比如發(fā)送異常的時(shí)候無法回收一些系統(tǒng)資源,或者沒有關(guān)閉當(dāng)前的連接等等。 JDK5之前,不能為單獨(dú)的Thread設(shè)置UncaughtExceptionHandler,也不能指定一個(gè)默認(rèn)的UncaughtExceptionHandler。為了可以設(shè)置一個(gè)UncaughtExceptionHandler,需要去繼承ThreadGroup并覆寫uncaughtException方法。在JDK5及以上版本中,我們可以通過Thread的實(shí)例方法setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh),為任何一個(gè)Thre
13、ad設(shè)置一個(gè)UncaughtExceptionHandler。當(dāng)然你也可以為所有Thread設(shè)置一個(gè)默認(rèn)的UncaughtExceptionHandler,通過調(diào)用Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法,這是Thread的一個(gè)static方法。 21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”我們把Thread的以下四個(gè)方法和一個(gè)接口看一下:(1)Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()方法:返回該線程由于未捕
14、獲到異常而突然終止時(shí)調(diào)用的處理程序。(2)void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 方法: 設(shè)置該線程由于未捕獲到異常而突然終止時(shí)調(diào)用的處理程序。(3)static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()方法: 返回線程由于未捕獲到異常而突然終止時(shí)調(diào)用的默認(rèn)處理程序。(4)static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExce
15、ptionHandler eh) 方法:設(shè)置當(dāng)線程由于未捕獲到異常而突然終止,并且沒有為該線程定義其他處理程序時(shí)所調(diào)用的默認(rèn)處理程序。(5)static interface Thread.UncaughtExceptionHandler接口:當(dāng) Thread因未捕獲的異常而突然終止時(shí),調(diào)用處理程序的接口。這要求我們定義一個(gè)Handler類時(shí),必須實(shí)現(xiàn)Thread.UncaughtExceptionHandler接口的void uncaughtException(Thread t,Throwable e)方法。如果不設(shè)置一個(gè)Handler,那么單個(gè)Thread的Handler是null。但是,如
16、果這個(gè)單個(gè)線程是ThreadGroup中的一個(gè)Thread,那么這個(gè)線程將使用ThreadGroup的UncaughtExceptionHandler。ThreadGroup自身已經(jīng)實(shí)現(xiàn)了Thread.UncaughtExceptionHandler接口。21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”uncaughtException(Thread a, Throwable e)可以拿到Thread,所以在uncaughtException釋放相關(guān)資源是最好的辦法。palmsuda_demo3工程中的類CrashHandler主要代碼如下:public class CrashHandler implemen
17、ts UncaughtExceptionHandler public static final String TAG = Constants.APP_TAG;private Thread.UncaughtExceptionHandler mDefaultHandler;private static CrashHandler INSTANCE = new CrashHandler(); / CrashHandler實(shí)例private CrashHandler() public static CrashHandler getInstance() return INSTANCE;public voi
18、d init(Context context) mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();Thread.setDefaultUncaughtExceptionHandler(this);Overridepublic void uncaughtException(Thread thread, Throwable ex) 21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”21.2.5 程序主要流程1PalmSudaApp的onCreate()方法程序的入口是PalmSudaApp的onCreate()方法,在onCreate()方法里
19、:創(chuàng)建了CrashHandler實(shí)例,并調(diào)用其實(shí)例方法init(),為整個(gè)應(yīng)用的線程設(shè)置了線程終止異常處理器;繼而通過ServiceManager啟動(dòng)了后臺(tái)的Service,并周期性觸發(fā)廣播接收器StartServiceRecevier的onReceive()方法。2Splash的onCreate()方法然后程序流程轉(zhuǎn)到閃屏Splash的onCreate()方法,Splash主要代碼如下:Splash界面延遲8秒后,通過Splash中的Handler運(yùn)行SplashHandler的run()方法,調(diào)用gotoPalmHome()方法,加載主界面PalmSudaHome。21.2 項(xiàng)目實(shí)戰(zhàn):“掌
20、上蘇大”public class Splash extends Activity private Handler handler = new Handler();Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);/設(shè)置為無標(biāo)題欄getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowM
21、anager.LayoutParams.FLAG_FULLSCREEN); /設(shè)置為全屏模式setContentView(R.layout.splash);/ 獲取當(dāng)前版本,并設(shè)置在啟動(dòng)界面的TextViewthis.getCurrentVersion();/ 延遲8秒,再運(yùn)行SplashHandler的run()方法handler.postDelayed(new SplashHandler(), 8000);class SplashHandler implements Runnable Overridepublic void run() gotoPalmHome();private void
22、 gotoPalmHome() /加載主界面Intent intent = new Intent(this, PalmSudaHome.class);startActivity(intent);finish();/ 把當(dāng)前的Activity從任務(wù)棧里面移除21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”3主界面PalmSudaHome的onCreate()方法這時(shí)程序流程轉(zhuǎn)到PalmSudaHome的onCreate()方法,PalmSudaHome主要代碼如下:public class PalmSudaHome extends BaseActivity private MainViewHelper mVie
23、wHelper;private SharedPreferences settings;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.palm_main);settings = PalmSudaApp.getInstance().getSettings(); /獲取本地設(shè)置文件mViewHelper = new MainViewHelper(this);loadData();private void load
24、Data() PalmSudaApp.contentId = ;if (TextUtils.isEmpty(PalmSudaApp.contentId) handleMainView(10285, 蘇州大學(xué), true, false);21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”private void handleMainView(final String contentid, final String addr,final boolean isfirst, final boolean isSwitch) MaintainMgr.getInstance().getModuleList(contentid
25、, addr, versionName,isfirst, new MaintainMgr.ContentReadyCallback() Overridepublic void dataReady(Object data) if (data != null) aItem = (ContentItem) data;setMainView(aItem, isSwitch); else showToast(沒有獲得數(shù)據(jù),請(qǐng)查看網(wǎng)絡(luò)是否通暢!););private void setMainView(ContentItem aItem, boolean isSwitch) mViewHelper.setC
26、otentItem(aItem);21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”由以上代碼,我們看到以下的流程:PalmSudaHome的onCreate()方法loadData()方法handleMainView(final String contentid, final String addr,final boolean isfirst, final boolean isSwitch)方法MaintainMgr.getInstance().getModuleList(final String contentId, final String content Address, final String ve
27、rsion,final boolean isfirst, final ContentReadyCallback aCallback)方法。必須注意到:MaintainMgr.getInstance()的getModuleList()方法的簽名表明,一旦成功獲得數(shù)據(jù),將進(jìn)行回調(diào),回調(diào)的是PalmSudaHome的setMainView(ContentItem aItem, boolean isSwitch)方法,繼而調(diào)用了MainViewHelper的setContentItem(ContentItem aItem)方法,使數(shù)據(jù)(包括遠(yuǎn)程數(shù)據(jù),譬如表示模塊的小圖標(biāo))在手機(jī)的主界面顯示出來。21.
28、2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”4MaintainMgr.getInstance()的getModuleList()方法獲得數(shù)據(jù)MaintainMgr.getInstance()的getModuleList()方法使用線程池ExecutorService實(shí)例中的線程執(zhí)行實(shí)現(xiàn)Runnable接口的任務(wù)(即執(zhí)行Run方法中的代碼)MaintainMgr的getAssetModuleList(String contentId)方法(注意傳進(jìn)去的參數(shù)是10285)MaintainMgr的getFromAsset(Context context, String fileName)方法(注意傳進(jìn)去的文件名fil
29、eName是datas/ 10285.txt,10285.txt是json數(shù)據(jù),存儲(chǔ)路徑是assets目錄下的datas文件夾。)MaintainMgr的getContentItem(String src, boolean isSave, String filename)方法(把json數(shù)據(jù)封裝到ContentItem實(shí)體對(duì)象中)。(說明:這里為了方便起見,并沒有從后臺(tái)數(shù)據(jù)庫中取數(shù)據(jù),而是把數(shù)據(jù)放到了10285.txt中,并且是json格式。實(shí)際開發(fā)中并非如此,而要進(jìn)行后臺(tái)接口的編寫,通過提供API接口,把后臺(tái)數(shù)據(jù)庫中的數(shù)據(jù)轉(zhuǎn)換成json格式數(shù)據(jù),以供手機(jī)客戶端訪問,如第18章服務(wù)器端接口編程
30、所述。)主管理類MaintainMgr的主要代碼如下:21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”public class MaintainMgr private static MaintainMgr mgr;private ContentItem mContentItem;private PalmSudaApp app = PalmSudaApp.getInstance();private ExecutorService executorService = null;private MaintainMgr() executorService = Executors.newFixedThreadPool(
31、6);public static MaintainMgr getInstance() if (mgr = null) mgr = new MaintainMgr();return mgr;public void getModuleList(final String contentId,final String contentAddress, final String version,final boolean isfirst, final ContentReadyCallback aCallback) final Handler handler = new Handler() public v
32、oid handleMessage(Message message) aCallback.dataReady(message.obj);21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”executorService.execute(new Runnable() Overridepublic void run() try String src = null;ContentItem contentItem = null;if (contentItem = null) src = getAssetModuleList(contentId);contentItem = getContentItem(src, fals
33、e, );if (contentItem != null) mContentItem = contentItem;handler.sendMessage(Message.obtain(handler, 0, contentItem); catch (Exception e) handler.sendMessage(Message.obtain(handler, 0, mContentItem);android.util.Log.e(hand, content item-, e););private ContentItem getContentItem(String src, boolean i
34、sSave, String filename) private String getAssetModuleList(String contentId) throws IOException return getFromAsset(app, datas/ + contentId + .txt);public String getFromAsset(Context context, String fileName) throws IOException public interface ContentReadyCallback public void dataReady(Object data);
35、21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”5回調(diào)MainViewHelper的setContentItem(ContentItem aItem)方法MainViewHelper的setContentItem(ContentItem aItem)方法MainViewHelper的notifyDataChange()方法MainViewHelper的setFlipperView(List gridItems)方法和setBarView(List barItems)方法手機(jī)界面上顯示出相應(yīng)的圖片和文字。(參見教學(xué)資源光盤code文件夾下第21章palmsuda_demo3工程中主界面幫助類MainViewHe
36、lper.java的代碼)。21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”21.2.5 推送的實(shí)現(xiàn)推送實(shí)現(xiàn)的步驟如下:(1)先把教學(xué)資源光盤code文件夾下第21章的asmack.jar和mialab-pushlib.jar兩個(gè)jar文件拷貝到palmsuda_demo3工程中l(wèi)ibs目錄下。(2)在AndroidManifest.xml文件中的application標(biāo)簽下注冊(cè)NotificationService和NotificationDetailsActivity。 21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”(3)在com.mialab.palmsuda.service包中創(chuàng)建ServiceManager類,在
37、ServiceManager類中添加startService()和startNotificationService()兩個(gè)方法,在ServiceManager的startService()方法中添加調(diào)用startNotificationService()方法的代碼。(4)在PalmSudaApp的onCreate()方法中創(chuàng)建ServiceManager實(shí)例,并添加調(diào)用ServiceManager的startService()實(shí)例方法,(代碼詳見教學(xué)資源光盤code文件夾下第21章palmsuda_demo3工程中的PalmSudaApp.java和ServiceManager.java。)(
38、5)把教學(xué)資源光盤code文件夾下第14章消息推送目錄下的mialabpush.war拷貝到Tomcat服務(wù)器的webapps目錄下,啟動(dòng)Tomcat服務(wù)器。(mialabpush.war的部署同第14章消息推送。)(6)如圖21-4所示,在mialabpush的控制臺(tái)輸入要推送的消息,便可實(shí)現(xiàn)推送。21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”圖21-4 mialabpush控制臺(tái) 圖21-5 客戶端顯示推送消息如圖21-5所示,手機(jī)客戶端顯示推送消息。21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”21.2.6 整個(gè)應(yīng)用的后臺(tái)服務(wù)和廣播接收機(jī)制在PalmSudaApp的onCreate()方法中調(diào)用ServiceMan
39、ager實(shí)例方法startService(),并通過bindReceiver(20);的調(diào)用,周期性觸發(fā)StartServiceRecevier的onReceive()方法。public class PalmSudaApp extends Application private ServiceManager serviceManager;Overridepublic void onCreate() serviceManager = new ServiceManager(this);serviceManager.setNotificationIcon(R.drawable.notificatio
40、n);serviceManager.startService();bindReceiver(20);21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”public void bindReceiver(int minutes) Log.d(bindReceiver, #bindReceiver: repeat minutes= + minutes);Intent intent = new Intent(PalmSudaApp.getInstance(),StartServiceRecevier.class);intent.setAction(start.service.receiver.action);Alarm
41、Manager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);if (sender != null) am.cancel(sender); else sender = PendingIntent.getBroadcast(PalmSudaApp.getInstance(), 0,intent, PendingIntent.FLAG_UPDATE_CURRENT);long trigerTime = System.currentTimeMillis() + 300000+ (long) (300000 * Math.ran
42、dom();if (Constants.TEST_MODE | Constants.DEBUG_MODE) minutes = 3;trigerTime = System.currentTimeMillis() + 90000;am.setRepeating(AlarmManager.RTC_WAKEUP, trigerTime, minutes * 60000,sender);21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”ServiceManager的startService()方法調(diào)用相關(guān)代碼如下:public final class ServiceManager private Context con
43、text;private Properties props;private String apiKey;private String xmppHost;private String xmppPort;public ServiceManager(Context context) this.context = context;props = loadProperties();apiKey = props.getProperty(apiKey, );xmppHost = props.getProperty(xmppHost, );xmppPort = props.getProperty(xmppPo
44、rt, 5222);private Properties loadProperties() Properties props = new Properties();try int id = context.getResources().getIdentifier(pushclient, raw,context.getPackageName();props.load(context.getResources().openRawResource(id); catch (Exception e) Log.e(LOGTAG, Could not find the properties file., e
45、);return props;public void startService() startNotificationService();startBackService();21.2 項(xiàng)目實(shí)戰(zhàn):“掌上蘇大”public void startNotificationService()Thread serviceThread = new Thread(new Runnable() Overridepublic void run() Intent intent = NotificationService.getIntent();context.startService(intent););serv
46、iceThread.start();public void startBackService() Log.d(LOGTAG, startBackService.);Intent intent = new Intent(com.mialab.palmsuda.service.BackService);context.startService(intent);context.bindService(intent, connection, Context.BIND_AUTO_CREATE);private BackService backService;private ServiceConnection connection = new ServiceConn
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年投資款轉(zhuǎn)為項(xiàng)目融資借款合同范本及合規(guī)審查3篇
- 2025年潮州貨運(yùn)資格證題庫在線練習(xí)
- 2025年淮安道路貨運(yùn)從業(yè)資格證模擬考試官方題下載
- 2025年大同考貨運(yùn)從業(yè)資格證
- 2025年貨運(yùn)從業(yè)資格證考試技巧與方法
- 洛陽理工學(xué)院《大數(shù)據(jù)平臺(tái)核心技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 火車站采暖系統(tǒng)施工協(xié)議
- 2024年物業(yè)抵押借款合同
- 商業(yè)地帶凈水機(jī)租賃合同協(xié)議書
- 文化場館改造增補(bǔ)合同
- 2024至2030年中國甲醚化氨基樹脂行業(yè)投資前景及策略咨詢研究報(bào)告
- 貴州省建筑工程施工資料管理導(dǎo)則
- 2024年度鋼模板生產(chǎn)與銷售承包合同3篇
- 《QHSE體系培訓(xùn)》課件
- 計(jì)量經(jīng)濟(jì)學(xué)論文-城鎮(zhèn)單位就業(yè)人員工資總額的影響因素
- 《農(nóng)業(yè)企業(yè)經(jīng)營管理》試題及答案(U)
- 山東省聊城市2024-2025學(xué)年高一上學(xué)期11月期中物理試題
- 孫悟空課件教學(xué)課件
- 華南理工大學(xué)《自然語言處理》2023-2024學(xué)年期末試卷
- 新能源行業(yè)光伏發(fā)電與儲(chǔ)能技術(shù)方案
- 中國高血壓防治指南(2024年修訂版)要點(diǎn)解讀
評(píng)論
0/150
提交評(píng)論