原文地址: http://blog.csdn.net/lchad/article/details/42198187
在我们日常使用Android App的时候,会经常有这样的一种情形:在一个App中触发了某种条件会打开另一个App。例如在手机QQ中给好友发送文件,就会打开文件管理器,给好友发送照片就会打开相册或者相机,然后让你选择照片抑或拍一张照片,还有就是比较令人讨厌的,点击某个图标自动跳转到应用市场,亲~安装我们的应用吧!!!这样的情形还有很多,不胜枚举,所以作为Android开发者的我们,应该知道它的实现原理。这篇文章算是一个备忘吧,总结一下我们作为开发者接触的比较多的情形。好了,废话不多说,我们直接上代码。
1.打开第三方应用,由于博主比较喜欢泡知乎,所以接下来的例子就用知乎手机客户端作为例子吧。照例,打开我们的Android Studio,新建一个叫做TestDemo的Project,然后一直next下去即可。我们的业务逻辑大概是点击一个Button,监听器坚挺Button,如果被点击了,那么打开第三方App。
布局界面代码(其实很简单辣,就是一个按钮):
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- android:paddingBottom="@dimen/activity_vertical_margin"
- tools:context=".MainActivity">
- <Button
- android:layout_marginTop="55dp"
- android:textSize="25sp"
- android:id="@+id/button"
- android:text="install another App"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </RelativeLayout>
Main_Activity.java代码:
- package com.example.chad.testdemo;
- import android.app.SearchManager;
- import android.content.ActivityNotFoundException;
- import android.content.Context;
- import android.content.Intent;
- import android.content.pm.PackageManager;
- import android.net.Uri;
- import android.os.Bundle;
- import android.support.v7.app.ActionBarActivity;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.Button;
- public class MainActivity extends ActionBarActivity {
- private Button mButton;
- public static final String ANOTHER_PACKAGE_NAME = "com.zhihu.android";
- /*
- **启动第三方App
- */
- public static void launchAnotherApp(Context context){
- if(isAppInstalled(context, ANOTHER_PACKAGE_NAME)){
- context.startActivity(context.getPackageManager().getLaunchIntentForPackage(ANOTHER_PACKAGE_NAME));
- } else{
- goToMarket(context, ANOTHER_PACKAGE_NAME);
- }
- }
- /*
- **检测第三方App是否已安装
- */
- public static boolean isAppInstalled(Context context, String packageName){
- try {
- context.getPackageManager().getPackageInfo(packageName, 0);
- return true;
- } catch (PackageManager.NameNotFoundException e) {
- e.printStackTrace();
- return false;
- }
- }
- /*
- **去应用市场下载页面
- */
- public static void goToMarket(Context context, String packageName){
- Uri uri = Uri.parse("market://details?id=" + packageName);
- Intent goToMarket = new Intent(Intent.ACTION_VIEW,uri);
- try {
- context.startActivity(goToMarket);
- } catch (ActivityNotFoundException e){
- e.printStackTrace();
- }
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mButton = (Button)findViewById(R.id.button);
- mButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- launchAnotherApp(MainActivity.this);
- }
- });
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.menu_main, menu);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
- //noinspection SimplifiableIfStatement
- if (id == R.id.action_settings) {
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
- }
好了,现在解释一下这段代码。
我们能否成功的掉取出指定的第三方应用的核心就是,一个正确的包名。这里解释一下什么叫包名,我们看一下MainActivity.java的第一行:
- package com.example.chad.testdemo;
实现这个功能我们定义了三个函数launchAnotherApp是功能的主体,isAppInstalled方法和goToMarket方法是被它调用来辅助它的。isAppInstalled的作用是判断这个应用是否已经被安装了,如果安装了那么好直接打开即可,如果是没有安装,那么就调用goToMarket方法进入应用市场界面,引导你下载这个App,思路还是很清晰的。
2.跳转到指定的网页
- //浏览网页
- public static void browesTheWeb(Context context, String theURL){ //theURL就是你指定的要打开的网页
- Uri uri = Uri.parse(theURL);
- Intent i = new Intent(Intent.ACTION_VIEW, uri);
- context.startActivity(i);
- }
- mButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //open the url www.baidu.com
- //browesTheWeb(MainActivity.this, "http://www.baidu.com");
- }
- });
3.调用系统的搜索功能
- // search
- public static void searchByGoogle(Context context, String contentToSearch){
- Intent i = new Intent();
- i.setAction(Intent.ACTION_SEARCH);
- i.putExtra(SearchManager.QUERY, contentToSearch);
- context.startActivity(i);
- }
4.调用谷歌地图或百度地图显示位置:
- public static void showTheMap(Context context, String mapToShow){
- Uri uri = Uri.parse(mapToShow);
- Intent i = new Intent(Intent.ACTION_VIEW, uri);
- context.startActivity(i);
- }
- showTheMap(MainActivity.this, "geo:113.461528,22.275482");
5.打电话
- public static void callSomePhone(Context context, String PhoneNumber){
- Uri uri = Uri.parse(PhoneNumber);
- Intent i = new Intent(Intent.ACTION_VIEW, uri);
- context.startActivity(i);
- }
- callSomePhone(MainActivity.this, "tel:15958003646");
6.发短信
- public static void sendAMessage(Context context, String PhoneNumber){
- Uri uri = Uri.parse(PhoneNumber);
- Intent i = new Intent(Intent.ACTION_SENDTO, uri);
- i.putExtra("sms_bodu", "the sms text");
- context.startActivity(i);
- // or the code following
- /*Intent it = new Intent(Intent.ACTION_VIEW);
- it.putExtra("sms_body", "TheSMS text");
- it.setType("vnd.android-dir/mms-sms");
- context.startActivity(it);*/
- }
- sendAMessage(MainActivity.this, "smsto:12345678");