Android开发Market


1,启动Android market到特定的某个应用

在开发的应用程序中,往往分“免费”、“收费”版,用户可以免费下载”免费”版应用程序进行体验,在感觉该应用程序值得去下载”收费”版后,此时如果开发 工程师能加增加一个按钮,点击可以进入对应应用程序在Android Market中的安装页面,如此定能提高用户体验。

以下代码可以帮你实现:

1
2
3
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=com.android.example"));
startActivity(intent);
其中URI的格式:market://details?id=<package_name>


当然你如果不知道要下载的具体的应用程序的id,你可以通过以下的代码进行搜索。

格式如下:

1
2
3
<URI_prefix>search?q=<search_query>   // To perform a raw text search, append the query string
 
<URI_prefix>search?q=pub:<publisher_name>  //To search based on the publisher name

实例代码:

1
2
3
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://search?q=pub:Your Publisher Name"));
startActivity(intent);

当然你也可以通过Android Market web site实现:

格式:

1
2
3
http://market.android.com/details?id=<package_name> // Display the details screen for a specific application
http://market.android.com/search?q=<query> // Search for applications using a general string query.
Search for applications by publisher name // http://market.android.com/search?q=pub:<publisher_name>

实例:

<a href="http://market.android.com/search?q=pub:Your Publisher Name">Search Link</a>

2,启动另一个应用程序

有时候需要在一个应用程序中启动另一个应用程序,比如说在你遍历出了Android Device上的所有已安装的应用,此时当点击其中某个应用的icon的时候会打开相应的应用程序,

代码实现:

1
2
3
4
5
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName("com.gigabud.bigram", "com.gigabud.bigram.SplashStartActivity");
intent.setComponent(cn);
startActivity(intent);

其中ComponentName传入的两个参数分别为:packageName(包名),className(类名)。但是我们往往是知道包名,但不知道 类名,或只知道类名,但不知道包名。其实不必多虑,无论是知道其中哪一个,我们都可以得到另一个的名称。在此我就不在扩展,有需求的网友可以自行探索一 番。

此处在晒出一个取得Android Device上所有已安装的应用程序的包名的方法:

1
2
3
4
5
6
7
8
9
10
final PackageManager packageManager = aaaa.this.getPackageManager();//获取packagemanager
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);//获取所有已安装程序的包信息
List<String> pName = new ArrayList<String>();//用于存储所有已安装程序的包名
 
if(pinfo != null){
for(int i = 0; i < pinfo.size(); i++){
String pn = pinfo.get(i).packageName;
System.out.println(pn);
}
}

3.关于监听Android Device Home键 

我们知道监听Android Device的Back键很简单,只要实现如下的代码:

 

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { //按下的如果是BACK,同时没有重复
Contants.IS_SEARCH=false;
goActivityMain();
return true;
}
return super.onKeyDown(keyCode, event);
}


但是要监听Home键却似乎没那么顺利啦,原因在于Android系统对Home键进行了特殊的处理。但在网上寻寻腻腻很久之后,终于发现一个貌似可行的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
private boolean catchHomeKey = true;
 
@Override
 
public void onAttachedToWindow() {
 
// TODO Auto-generated method stub
 
if(catchHomeKey) {
 
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
 
}
 
super.onAttachedToWindow();
 
}
 
@Override
 
public boolean onKeyDown(int keyCode, KeyEvent event) {
 
// TODO Auto-generated method stub
 
if(keyCode == KeyEvent.KEYCODE_HOME) {
 
Intent it = new Intent();
 
it.setClass(ActivityWebView.this, ActivityMain.class);
 
startActivity(it);
 
}
 
return super.onKeyDown(keyCode, event);
 
}

运行这段代码,确实Home被监听了,点击Home button之后不再跳转到桌面了,而是执行了我设置的跳转。但如果你细细考究一番,你就会发现这个方法存在问题,在运行你的程序的时候,你也许会发现一 些Button点击一次不会触发监听,再次点击的时候才会触发,或者在install应用程序的时候,在log中会报莫名其妙的 Exception……….


其实我们先可以来看看点击Home键后情况,点击Home键后,回到Android Device桌面,但此时app并没有被Destroy掉,而是在后台运行,在device内存不吃紧的情况下,系统并不会将该app销毁掉,这点跟 Iphone不同,Iphone只有一个按钮,点击它会将当前app销毁并回到桌面,而Android这样做的原因,据官方文档解析是可以加快程序的运 行,提高执行效率。既然当前app没有被Destroy掉,当再次点击icon进入的时候,会依次执行 OnRestart(),OnStart(),OnResume()方法再次显示退出时的页面,那么此刻,如果你在进行其他的操作,由于是直接显示该页 面,没有前一个跳转过来的页面传的数据,以及或者你引用了其他某个页面的全局静态变量的值,那么会因为这些数据为空报Null pointer的Exception。那么网上有很多介绍,在退出的时候,在onPause()或onSaveInstanceState(Bundle savedInstanceState)中将数据进行保存,当再次进入的时候,通过onCreate(Bundle savedInstanceState)或onRestoreInstanceState(Bundle savedInstanceState)将数据还原。此方法当然也可以解决问题,但我想这样做比较繁琐,而且很难保存到所有的数据。

结合我做的app后我发现,在OnRestart()方法中实现如下代码可以解决Null pointer的Exception。代码如下:
 
@Override
protected void onRestart() {
super.onRestart();
Intent it = new Intent();
it.setClass(ActivityCompare.this, ActivityMain.class);
startActivity(it);
}

这样做的想法其实很简单,在每次点击icon进入app时候,此刻app终归是走两条路线:1.OnCreate()->OnStart()->OnResume();2.OnRestart()->OnStart()->OnResume().


第一条路线(OnCreate()->OnStart()->OnResume())当然是不会有问题,这是正常执行路线。第二条路线 (OnRestart()->OnStart()->OnResume().),OnResume()之前,也就是在app显示之前,我在 onRestart()执行了一个Intent,跳转到ActivityMain Activity后,将ActivityMain呈现在用户面前,此处之所以跳转到ActivityMain页面,是因为这个页面是开始页面,执行的大部 分都是初始化的操作,不牵扯到保存和引用的问题,因而出现Null pointer的Exception的概率大大降低,更主要的是对用户使用体验影响不大。

posted on 2012-01-23 19:23  Fleezn  阅读(448)  评论(0编辑  收藏  举报

导航