Android开发
最近一直在做一个学习中文的软件,软件也即将上架,在开发过程中遇到过一些挫折,慢慢积累了一些经验。其中一些小知识点不足以长篇大论的叙述,于是也就放在一篇文章中加以叙述,一来作为自身一个知识点的记录,二来和众多网友一起共享。
1,启动Android market到特定的某个应用
在开发的应用程序中,往往分“免费”、“收费”版,用户可以免费下载”免费”版应用程序进行体验,在感觉该应用程序值得去下载”收费”版后,此时如果开发 工程师能加增加一个按钮,点击可以进入对应应用程序在Android Market中的安装页面,如此定能提高用户体验。
以下代码可以帮你实现:
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,你可以通过以下的代码进行搜索。
格式如下:
<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
实例代码:
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("market://search?q=pub:Your Publisher Name")); startActivity(intent);
当然你也可以通过Android Market web site实现:
格式:
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的时候会打开相应的应用程序,
代码实现:
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上所有已安装的应用程序的包名的方法:
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键进行了特殊的处理。但在网上寻寻腻腻很久之后,终于发现一个貌似可行的方法。
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的概率大大降低,更主要的是对用户使用体验影响不大。
暂停,待续。。。。。。。。。