2023年11月26日发(作者:)

OverView:

程序通过后台每天检查是否有最新版本,如果需要更新当前版本,将弹出对话框

让用户选择是否在当前通过Market来更新软件。

Knowledge Points:

SharedPreferences: 一个轻量级的存储方法,类似于经常使用的.ini

件,它也是通过检索关键字来取得相应的数值。之所以是成为轻量级,

因为它所能应用的数值类型有限,对于存储较大数值,效率相对较低。

方参考

tTimeMillis:将当前时间以毫秒作为单位来表示,用于比

较两个时间的先后顺序。(其数值表示从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. te(savedInstanceState);

8. setContentView();

9.

10. mHandler = new Handler();

11.

12. /* Get Last Update Time from Preferences */

13. SharedPreferences prefs = getPreferences(0);

14. long lastUpdateTime = g("lastUpdateTime",

tTimeMillis());

15.

16. int curVersion = 0;

17. try {

18. curVersion =

getPackageManager().getPackageInfo("", 0).versionCode;

19. } catch (NameNotFoundException e) {

20. // TODO Auto-generated catch block

21. tackTrace();

22. }

23. Log.i("DEMO",f(curVersion));

24. /* Should Activity Check for Updates Now? */

25. if ((lastUpdateTime + (24 * 60 * 60 * 1000)) <

tTimeMillis()) {

26.

27. /* Save current timestamp for next Check*/

28. lastUpdateTime = tTimeMillis();

29. editor = getPreferences(0).edit();

30. g("lastUpdateTime", lastUpdateTime);

31. ();

32.

33. /* Start Update */

34. // ();

35. }

36. }

37.

38. /* This Thread checks for Updates in the Background */

39. private Thread checkUpdate = new Thread()

40. {

41. public void run() {

42. try {

43. URL updateURL = new

66. } catch (Exception e) {

67. }

68. }

69. };

70.

71. /* This Runnable creates a Dialog and asks the user to open the Market */

72. private Runnable showUpdate = new Runnable(){

73. public void run(){

74. new r()

75. .setIcon()

76. .setTitle("Update Available")

77. .setMessage("An update for is available!nnOpen Android Market

and see the details?")

78. .setPositiveButton("Yes", new kListener() {

79. public void onClick(DialogInterface dialog, int whichButton)

{

80. /* User clicked OK so do some stuff */

81. Intent intent = new Intent(_VIEW,

("market://search?q=pname:"));

82. startActivity(intent);

83. }

84. })

85. .setNegativeButton("No", new kListener() {

86. public void onClick(DialogInterface dialog, int whichButton)

{

87. /* User clicked Cancel */

88. }

89. })

90. .show();

*********************************************************************

**********************

向上言:

本人在论坛曾经发过一关于此问题的求助帖,虽然大至的思路和上文差不

多,关键点是在于程序如何更新,现在看到它这里指出的更新方法居然是登录

market。不过以后发布的程序都是在market中,问题就不存在。

1. Intent intent = new

Intent(_VIEW,

("market://search?q=pname:"));

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

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 onto device

'emulator-5554'

8. [2009-06-06 19:53:50 - Hello] Installing ...

9. [2009-06-06 19:54:05 - Hello] Application already exists.

Attempting to

10.[2009-06-06 19:54:31 - Hello] Success!

复制代码

分析:

1android正常运行

2。通过配置文件中运行我们的程序

3Uploading onto device 'emulator-5554'这句是关键,更新我们

的程序

4Installing ...

5Application already exists. Attempting to //

程序已经存在,尝试重新安装

所以如果我们的程序要自动更新,本人初步猜想是和上面的步骤是一样的。

详看logcat中的log

1. 06-06 11:54:02.567: DEBUG/PackageParser(582): Scanning package:

/data/app/

2. 06-06 11:54:08.048: INFO/PackageManager(582): Removing non-system

package:

3. 06-06 11:54:08.187: DEBUG/PackageManager(582): Removing package

4. 06-06 11:54:08.286: DEBUG/PackageManager(582): Activities:

5. 06-06 11:54:11.136: DEBUG/PackageManager(582): Scanning package

6. 06-06 11:54:11.301: INFO/PackageManager(582):

/data/app/ changed; unpacking

7. 06-06 11:54:11.626: DEBUG/installd(555): DexInv: --- BEGIN

'/data/app/' ---

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

主点是关于:getPackageManager()在这个下面有很多方法,你可以通过它得,

得到当前终端安装的程序等。关于安装包的函数是:

getPackageManager().installPackage(packageURI)

动手试验:

dos状态下运行:

查看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/

3. 06-06 12:19:07.738: INFO/PackageManager(582):

/data/app/ changed; unpacking

4. 06-06 12:19:07.978: DEBUG/installd(555): DexInv: --- BEGIN

'/data/app/' ---

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/' (success) ---

复制代码

1。接收数据,保存到临时文件中/data/app/

2。解压此文件,注意路径

/data/dalvik-cache/data@app@@

它是在data下的dalvik-cache

3.安装文件[这个步骤还包括查找程序是否已经安装等]

4.使用GC清理内存

查看DDMS中的结构

看到此文件结构,应该可以想起linux下的文件系统和它的权限管理,也就可以

理解,为什么我们的程序无法在data下创建文件之类的问题了。

转载:/?p=349