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!
复制代码
分析:
1。android正常运行
2。通过配置文件中运行我们的程序
3。Uploading onto device 'emulator-5554'这句是关键,更新我们
的程序
4。Installing ...
5。Application 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


发布评论