<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小菜毛毛技術分享

    與大家共同成長

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks
    OverView:
    程序通過后臺每天檢查是否有最新版本,如果需要更新當前版本,將彈出對話框讓用戶選擇是否在當前通過Market來更新軟件
    Knowledge Points:
    • SharedPreferences: 一個輕量級的存儲方法,類似于經常使用的.ini文件,它也是通過檢索關鍵字來取得相應的數值。之所以是成為輕量級,是因為它所能應用的數值類型有限,對于存儲較大數值,效率相對較低。官方參考
    • System.currentTimeMillis:將當前時間以毫秒作為單位來表示,用于比較兩個時間的先后順序。(其數值表示從1970-01-01 00:00:00直到當前時間的總毫秒數)官方參考
    • 通過網絡來讀取信息:在checkUpdate()方法中包含了通過制定的URL來讀取網絡資源。具體操作步驟,請參考源代碼
    • Runnable: 在其內部的Run()方法中實現所要執行的任何代碼,當這個runnable interface被調用后可以視作為新的線程。
    Source Code:
    1. public class hello extends Activity  {
    2.         /** Called when the activity is first created. */
    3.         private Handler mHandler;
    4.          
    5.     @Override
    6.     public void onCreate(Bundle savedInstanceState) {
    7.         super.onCreate(savedInstanceState);
    8.         setContentView(R.layout.main);
    9.         
    10.         mHandler = new Handler();

    11.         /* Get Last Update Time from Preferences */
    12.         SharedPreferences prefs = getPreferences(0);
    13.         long lastUpdateTime =  prefs.getLong("lastUpdateTime", System.currentTimeMillis());

    14.         int curVersion = 0;
    15.                 try {
    16.                         curVersion = getPackageManager().getPackageInfo("linhai.com.hello", 0).versionCode;
    17.                 } catch (NameNotFoundException e) {
    18.                         // TODO Auto-generated catch block
    19.                         e.printStackTrace();
    20.                 }
    21.         Log.i("DEMO",String.valueOf(curVersion));
    22.         /* Should Activity Check for Updates Now? */
    23.         if ((lastUpdateTime + (24 * 60 * 60 * 1000)) < System.currentTimeMillis()) {

    24.             /* Save current timestamp for next Check*/
    25.            lastUpdateTime = System.currentTimeMillis();
    26.             SharedPreferences.Editor editor = getPreferences(0).edit();
    27.             editor.putLong("lastUpdateTime", lastUpdateTime);
    28.             editor.commit();      

    29.             /* Start Update */
    30.          //   checkUpdate.start();
    31.         }
    32.     }

    33.     /* This Thread checks for Updates in the Background */
    34.     private Thread checkUpdate = new Thread()
    35.     {
    36.         public void run() {
    37.             try {
    38.                 URL updateURL = new URL("http://my.company.com/update");
    39.                 URLConnection conn = updateURL.openConnection();
    40.                 InputStream is = conn.getInputStream();
    41.                 BufferedInputStream bis = new BufferedInputStream(is);
    42.                 ByteArrayBuffer baf = new ByteArrayBuffer(50);

    43.                 int current = 0;
    44.                 while((current = bis.read()) != -1){
    45.                      baf.append((byte)current);
    46.                 }

    47.                 /* Convert the Bytes read to a String. */
    48.                 final String s = new String(baf.toByteArray());        

    49.                 /* Get current Version Number */
    50.                 int curVersion = getPackageManager().getPackageInfo("your.app.id", 0).versionCode;
    51.                 int newVersion = Integer.valueOf(s);

    52.                 /* Is a higher version than the current already out? */
    53.                 if (newVersion > curVersion) {
    54.                     /* Post a Handler for the UI to pick up and open the Dialog */
    55.                     mHandler.post(showUpdate);
    56.                 }
    57.             } catch (Exception e) {
    58.             }
    59.         }
    60.     };

    61.     /* This Runnable creates a Dialog and asks the user to open the Market */
    62.     private Runnable showUpdate = new Runnable(){
    63.            public void run(){
    64.             new AlertDialog.Builder(hello.this)
    65.             .setIcon(R.drawable.ok)
    66.             .setTitle("Update Available")
    67.             .setMessage("An update for is available!\n\nOpen Android Market and see the details?")
    68.             .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
    69.                     public void onClick(DialogInterface dialog, int whichButton) {
    70.                             /* User clicked OK so do some stuff */
    71.                             Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:your.app.id"));
    72.                             startActivity(intent);
    73.                     }
    74.             })
    75.             .setNegativeButton("No", new DialogInterface.OnClickListener() {
    76.                     public void onClick(DialogInterface dialog, int whichButton) {
    77.                             /* User clicked Cancel */
    78.                     }
    79.             })
    80.             .show();
    81.            }
    82.     };
    83.   
    84. }
    復制代碼


    分為三個部分:
    • 置于onCreate()方法中的程序用于判斷當前時間是否需要檢查更新(如果距離上次更新時間大于1天,將啟動檢查更新)
    • 當以上條件滿足時,啟動checkUpdate來檢查當前程序是否為最新版本。
    • 如果確定版本已過期,那么將登錄market,并直接指向當前程序頁面。
    *******************************************************************************************
    向上言:
         本人在論壇曾經發過一關于此問題的求助帖,雖然大至的思路和上文差不多,關鍵點是在于程序如何更新,現在看到它這里指出的更新方法居然是登錄market。不過以后發布的程序都是在market中,問題就不存在。
    1.                             Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:your.app.id"));
    2.                             startActivity(intent);
    復制代碼
    大家都是在eclipse上開發吧,在每次更新代碼,運行模擬器時,大家是否有注意到console的提示信息:
    1. [2009-06-06 19:53:50 - Hello] Android Launch!
    2. [2009-06-06 19:53:50 - Hello] adb is running normally.
    3. [2009-06-06 19:53:50 - Hello] Performing linhai.com.hello.hello activity launch
    4. [2009-06-06 19:53:50 - Hello] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'avd'
    5. [2009-06-06 19:53:50 - Hello] WARNING: Application does not specify an API level requirement!
    6. [2009-06-06 19:53:50 - Hello] Device API version is 3 (Android 1.5)
    7. [2009-06-06 19:53:50 - Hello] Uploading Hello.apk onto device 'emulator-5554'
    8. [2009-06-06 19:53:50 - Hello] Installing Hello.apk...
    9. [2009-06-06 19:54:05 - Hello] Application already exists. Attempting to re-install instead...
    10. [2009-06-06 19:54:31 - Hello] Success!
    復制代碼
    分析:
    1。android正常運行
    2。通過配置文件AndroidManifest.xml中運行我們的程序
    3。Uploading Hello.apk onto device 'emulator-5554'這句是關鍵,更新我們的程序
    4。Installing Hello.apk...
    5。Application already exists. Attempting to re-install instead...//程序已經存在,嘗試重新安裝

    所以如果我們的程序要自動更新,本人初步猜想是和上面的步驟是一樣的。
    詳看logcat中的log
    1. 06-06 11:54:02.567: DEBUG/PackageParser(582): Scanning package: /data/app/vmdl12464.tmp
    2. 06-06 11:54:08.048: INFO/PackageManager(582): Removing non-system package:linhai.com.hello
    3. 06-06 11:54:08.187: DEBUG/PackageManager(582): Removing package linhai.com.hello
    4. 06-06 11:54:08.286: DEBUG/PackageManager(582):   Activities: linhai.com.hello.hello
    5. 06-06 11:54:11.136: DEBUG/PackageManager(582): Scanning package linhai.com.hello
    6. 06-06 11:54:11.301: INFO/PackageManager(582): /data/app/vmdl12464.tmp changed; unpacking
    7. 06-06 11:54:11.626: DEBUG/installd(555): DexInv: --- BEGIN '/data/app/vmdl12464.tmp' ---
    8. 06-06 11:54:12.987: DEBUG/dalvikvm(7756): DexOpt: load 224ms, verify 265ms, opt 1ms
    9. 06-06 11:54:13.047: DEBUG/installd(555): DexInv: --- END '/data/app/vmdl12464.tmp' (success) ---
    10. 06-06 11:54:13.057: DEBUG/PackageManager(582):   Activities: linhai.com.hello.hello
    11. 06-06 11:54:15.608: INFO/installd(555): move /data/dalvik-cache/data@app@vmdl12464.tmp@classes.dex -> /data/dalvik-cache/data@app@linhai.com.hello.apk@classes.dex
    12. 06-06 11:54:15.737: DEBUG/PackageManager(582): New package installed in /data/app/linhai.com.hello.apk
    復制代碼
    關于此類的自動更新的第三方管理軟件已經有了叫aTrackDog,其原理就是使用上面的方式。
    關于得到版本號,使用:
    1. int curVersion = getPackageManager().getPackageInfo("your.app.id", 0).versionCode;
    復制代碼
    程序版本號的是放在AndroidManifest.xml文件中:
    1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    2.         package="linhai.com.hello" android:versionCode="2" android:versionName="2.0.1">
    復制代碼
    主點是關于:getPackageManager()在這個下面有很多方法,你可以通過它得,得到當前終端安裝的程序等。關于安裝包的函數是:getPackageManager().installPackage(packageURI)

    動手試驗:
    在dos狀態下運行:
    1.JPG
    查看logcat下的信息,大致和剛才相同,分析流程:
    1. 06-06 12:18:58.827: INFO/jdwp(8368): received file descriptor 20 from ADB
    2. 06-06 12:19:02.546: DEBUG/PackageParser(582): Scanning package: /data/app/vmdl12465.tmp
    3. 06-06 12:19:07.738: INFO/PackageManager(582): /data/app/vmdl12465.tmp changed; unpacking
    4. 06-06 12:19:07.978: DEBUG/installd(555): DexInv: --- BEGIN '/data/app/vmdl12465.tmp' ---
    5. 06-06 12:19:09.617: DEBUG/dalvikvm(8378): DexOpt: load 254ms, verify 564ms, opt 3ms
    6. 06-06 12:19:09.697: DEBUG/installd(555): DexInv: --- END '/data/app/vmdl12465.tmp' (success) ---
    7. 06-06 12:19:11.907: INFO/installd(555): move /data/dalvik-cache/data@app@vmdl12465.tmp@classes.dex -> /data/dalvik-cache/data@app@com.example.android.snake.apk@classes.dex
    8. 06-06 12:19:11.956: DEBUG/PackageManager(582): New package installed in /data/app/com.example.android.snake.apk
    9. 06-06 12:19:14.746: DEBUG/dalvikvm(8368): VM cleaning up
    10. 06-06 12:19:14.857: DEBUG/dalvikvm(8368): LinearAlloc 0x0 used 628420 of 4194304 (14%)
    11. 06-06 12:19:15.897: DEBUG/dalvikvm(582): GC freed 17704 objects / 903984 bytes in 615ms
    12. 06-06 12:19:15.936: DEBUG/HomeLoaders(625): application intent received: android.intent.action.PACKAGE_ADDED, replacing=false
    13. 06-06 12:19:15.936: DEBUG/HomeLoaders(625):   --> package:com.example.android.snake
    14. 06-06 12:19:15.936: DEBUG/HomeLoaders(625):   --> add package
    復制代碼
    1。接收數據,保存到臨時文件中/data/app/vmdl12465.tmp
    2。解壓此文件,注意路徑/data/dalvik-cache/data@app@vmdl12465.tmp@classes.dex
    它是在data下的dalvik-cache下
    3.安裝文件[這個步驟還包括查找程序是否已經安裝等]
    4.使用GC清理內存

    查看DDMS中的結構
    2.JPG
    看到此文件結構,應該可以想起linux下的文件系統和它的權限管理,也就可以理解,為什么我們的程序無法在data下創建文件之類的問題了。
    轉載:http://www.androidres.com/?p=349
    posted on 2010-11-23 11:07 小菜毛毛 閱讀(395) 評論(0)  編輯  收藏 所屬分類: andriod
    主站蜘蛛池模板: 免费永久看黄在线观看app| 99久久免费国产香蕉麻豆| 亚洲成AV人网址| 色综合久久精品亚洲国产| 最近的中文字幕大全免费版| 亚洲国产成+人+综合| 免费福利在线播放| 亚洲a级在线观看| 在线观看视频免费完整版| 久久乐国产综合亚洲精品| 好吊妞在线成人免费| 美女黄频免费网站| 亚洲高清成人一区二区三区| 香蕉免费看一区二区三区| 亚洲avav天堂av在线不卡| 久久久久久精品成人免费图片 | 亚洲精品亚洲人成在线观看下载 | 国产亚洲情侣一区二区无码AV| a在线视频免费观看在线视频三区| 亚洲成AⅤ人影院在线观看| 日韩在线视频播放免费视频完整版| 久久亚洲国产成人影院网站| 嫩草在线视频www免费看| 亚洲精品资源在线| 成人午夜视频免费| 青草青草视频2免费观看| 亚洲色无码专区在线观看| 中文字幕亚洲免费无线观看日本 | 美丽姑娘免费观看在线观看中文版| 亚洲精品国产福利在线观看| 全免费a级毛片免费看不卡| www成人免费观看网站| 91在线亚洲精品专区| 日本黄色免费观看| 国产做国产爱免费视频| 亚洲a级成人片在线观看| 免费a级毛片在线观看| 香港a毛片免费观看| 亚洲欧美日韩国产精品一区| 亚洲综合精品香蕉久久网| 最新黄色免费网站|