【Android】打开第三方App以及系统应用服务

原文地址:    http://blog.csdn.net/lchad/article/details/42198187




在我们日常使用Android App的时候,会经常有这样的一种情形:在一个App中触发了某种条件会打开另一个App。例如在手机QQ中给好友发送文件,就会打开文件管理器,给好友发送照片就会打开相册或者相机,然后让你选择照片抑或拍一张照片,还有就是比较令人讨厌的,点击某个图标自动跳转到应用市场,亲~安装我们的应用吧!!!这样的情形还有很多,不胜枚举,所以作为Android开发者的我们,应该知道它的实现原理。这篇文章算是一个备忘吧,总结一下我们作为开发者接触的比较多的情形。好了,废话不多说,我们直接上代码。


1.打开第三方应用,由于博主比较喜欢泡知乎,所以接下来的例子就用知乎手机客户端作为例子吧。照例,打开我们的Android Studio,新建一个叫做TestDemo的Project,然后一直next下去即可。我们的业务逻辑大概是点击一个Button,监听器坚挺Button,如果被点击了,那么打开第三方App。


布局界面代码(其实很简单辣,就是一个按钮):

[html]  view plain  copy
  1. <RelativeLayout  
  2.     xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     android:paddingBottom="@dimen/activity_vertical_margin"  
  10.     tools:context=".MainActivity">  
  11.   
  12.     <Button  
  13.         android:layout_marginTop="55dp"  
  14.         android:textSize="25sp"  
  15.         android:id="@+id/button"  
  16.         android:text="install another App"  
  17.         android:layout_width="match_parent"  
  18.         android:layout_height="wrap_content" />  
  19.   
  20. </RelativeLayout>  


界面效果(机器为Nexus 6):

Main_Activity.java代码:

[java]  view plain  copy
  1. package com.example.chad.testdemo;  
  2.   
  3. import android.app.SearchManager;  
  4. import android.content.ActivityNotFoundException;  
  5. import android.content.Context;  
  6. import android.content.Intent;  
  7. import android.content.pm.PackageManager;  
  8. import android.net.Uri;  
  9. import android.os.Bundle;  
  10. import android.support.v7.app.ActionBarActivity;  
  11. import android.view.Menu;  
  12. import android.view.MenuItem;  
  13. import android.view.View;  
  14. import android.widget.Button;  
  15.   
  16.   
  17. public class MainActivity extends ActionBarActivity {  
  18.     private Button mButton;  
  19.      
  20.     public static final String ANOTHER_PACKAGE_NAME = "com.zhihu.android";  
  21.     /* 
  22.     **启动第三方App 
  23.      */  
  24.     public static void launchAnotherApp(Context context){  
  25.         if(isAppInstalled(context, ANOTHER_PACKAGE_NAME)){  
  26.             context.startActivity(context.getPackageManager().getLaunchIntentForPackage(ANOTHER_PACKAGE_NAME));  
  27.         } else{  
  28.             goToMarket(context, ANOTHER_PACKAGE_NAME);  
  29.         }  
  30.     }  
  31.     /* 
  32.     **检测第三方App是否已安装 
  33.      */  
  34.     public static boolean isAppInstalled(Context context, String packageName){  
  35.         try {  
  36.             context.getPackageManager().getPackageInfo(packageName, 0);  
  37.             return true;  
  38.         } catch (PackageManager.NameNotFoundException e) {  
  39.             e.printStackTrace();  
  40.             return false;  
  41.         }  
  42.   
  43.     }  
  44.     /* 
  45.     **去应用市场下载页面 
  46.      */  
  47.     public static void goToMarket(Context context, String packageName){  
  48.         Uri uri = Uri.parse("market://details?id=" + packageName);  
  49.         Intent goToMarket = new Intent(Intent.ACTION_VIEW,uri);  
  50.         try {  
  51.             context.startActivity(goToMarket);  
  52.         } catch (ActivityNotFoundException e){  
  53.             e.printStackTrace();  
  54.         }  
  55.     }  
  56.   
  57.      
  58.     @Override  
  59.     protected void onCreate(Bundle savedInstanceState) {  
  60.         super.onCreate(savedInstanceState);  
  61.         setContentView(R.layout.activity_main);  
  62.         mButton = (Button)findViewById(R.id.button);  
  63.         mButton.setOnClickListener(new View.OnClickListener() {  
  64.             @Override  
  65.             public void onClick(View v) {  
  66.                 launchAnotherApp(MainActivity.this);  
  67.   
  68.             }  
  69.         });  
  70.     }  
  71.   
  72.   
  73.     @Override  
  74.     public boolean onCreateOptionsMenu(Menu menu) {  
  75.         // Inflate the menu; this adds items to the action bar if it is present.  
  76.         getMenuInflater().inflate(R.menu.menu_main, menu);  
  77.         return true;  
  78.     }  
  79.   
  80.     @Override  
  81.     public boolean onOptionsItemSelected(MenuItem item) {  
  82.         // Handle action bar item clicks here. The action bar will  
  83.         // automatically handle clicks on the Home/Up button, so long  
  84.         // as you specify a parent activity in AndroidManifest.xml.  
  85.         int id = item.getItemId();  
  86.   
  87.         //noinspection SimplifiableIfStatement  
  88.         if (id == R.id.action_settings) {  
  89.             return true;  
  90.         }  
  91.   
  92.         return super.onOptionsItemSelected(item);  
  93.     }  
  94. }  

好了,现在解释一下这段代码。

我们能否成功的掉取出指定的第三方应用的核心就是,一个正确的包名。这里解释一下什么叫包名,我们看一下MainActivity.java的第一行:

[java]  view plain  copy
  1. package com.example.chad.testdemo;  
相信学过java的朋友对包一定不会陌生。就是为了唯一标识每个类并分组,所以java使用了package的概念。一般而言,包的名字都是公司网址的倒序,如com.google.*,如果对包的概念仍有疑问的同学,你可以自己找一本书翻翻,理解起来并不难。而在我们的Android开发中Package的作用是差不多的,你可以把包理解为我们每一个App的”身份证号“,它唯一标识了我们的App跟其他的App是不同的,这样才能在应用市场浩如烟海的App中确定你是唯一的,所以劝各位一定要给自己的App取一个独特的包名,要不然就会很尴尬,比如豌豆荚有一个洗白白的功能,不知道大家知不知道,如果你和别人的App包名相同,那么你的App就用可能被洗掉,被认为是一个脏应用

实现这个功能我们定义了三个函数launchAnotherApp是功能的主体,isAppInstalled方法和goToMarket方法是被它调用来辅助它的。isAppInstalled的作用是判断这个应用是否已经被安装了,如果安装了那么好直接打开即可,如果是没有安装,那么就调用goToMarket方法进入应用市场界面,引导你下载这个App,思路还是很清晰的。


2.跳转到指定的网页

[java]  view plain  copy
  1. //浏览网页  
  2.     public static void browesTheWeb(Context context, String theURL){     //theURL就是你指定的要打开的网页  
  3.         Uri uri = Uri.parse(theURL);  
  4.         Intent i = new Intent(Intent.ACTION_VIEW, uri);  
  5.         context.startActivity(i);  
  6.     }  
我们可以再监听器的onClick方法中调用这个静态方法,如下:

[java]  view plain  copy
  1. mButton.setOnClickListener(new View.OnClickListener() {  
  2.     @Override  
  3.     public void onClick(View v) {    
  4.         //open the url www.baidu.com  
  5.         //browesTheWeb(MainActivity.this, "http://www.baidu.com");  
  6.   
  7.     }  
  8. });  


3.调用系统的搜索功能

[java]  view plain  copy
  1. // search   
  2.     public static void searchByGoogle(Context context, String contentToSearch){   
  3.         Intent i = new Intent();  
  4.         i.setAction(Intent.ACTION_SEARCH);  
  5.         i.putExtra(SearchManager.QUERY, contentToSearch);  
  6.         context.startActivity(i);  
  7.     }  
我们仍然是在监听器的onClick方法中调用这个静态方法。

4.调用谷歌地图或百度地图显示位置:

[java]  view plain  copy
  1. public static void showTheMap(Context context, String mapToShow){  
  2.         Uri uri = Uri.parse(mapToShow);  
  3.         Intent i = new Intent(Intent.ACTION_VIEW, uri);  
  4.         context.startActivity(i);  
  5.     }  
函数调用方法(监听器部分的代码我就省略了哈):

[java]  view plain  copy
  1. showTheMap(MainActivity.this"geo:113.461528,22.275482");  

5.打电话

[java]  view plain  copy
  1. public static void callSomePhone(Context context, String PhoneNumber){  
  2.         Uri uri = Uri.parse(PhoneNumber);  
  3.         Intent i = new Intent(Intent.ACTION_VIEW, uri);  
  4.         context.startActivity(i);  
  5.     }  
函数调用方法:

[java]  view plain  copy
  1. callSomePhone(MainActivity.this"tel:15958003646");  

6.发短信

[java]  view plain  copy
  1. public static void sendAMessage(Context context, String PhoneNumber){  
  2.         Uri uri = Uri.parse(PhoneNumber);  
  3.         Intent i = new Intent(Intent.ACTION_SENDTO, uri);  
  4.         i.putExtra("sms_bodu""the sms text");  
  5.         context.startActivity(i);  
  6.         // or the code following  
  7.         /*Intent it = new Intent(Intent.ACTION_VIEW); 
  8.         it.putExtra("sms_body", "TheSMS text"); 
  9.         it.setType("vnd.android-dir/mms-sms"); 
  10.         context.startActivity(it);*/  
  11.           
  12.     }  
函数调用方法:

[java]  view plain  copy
  1. sendAMessage(MainActivity.this"smsto:12345678");  

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值