您的位置:首页 > 移动开发

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

2016-04-14 13:38 281 查看
原文地址: 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

<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>

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

Main_Activity.java代码:

[java] view
plain copy

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的第一行:

[java] view
plain copy

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

//浏览网页

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);

}

我们可以再监听器的onClick方法中调用这个静态方法,如下:

[java] view
plain copy

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.调用系统的搜索功能

[java] view
plain copy

// 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);

}

我们仍然是在监听器的onClick方法中调用这个静态方法。

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

[java] view
plain copy

public static void showTheMap(Context context, String mapToShow){

Uri uri = Uri.parse(mapToShow);

Intent i = new Intent(Intent.ACTION_VIEW, uri);

context.startActivity(i);

}

函数调用方法(监听器部分的代码我就省略了哈):

[java] view
plain copy

showTheMap(MainActivity.this, "geo:113.461528,22.275482");

5.打电话

[java] view
plain copy

public static void callSomePhone(Context context, String PhoneNumber){

Uri uri = Uri.parse(PhoneNumber);

Intent i = new Intent(Intent.ACTION_VIEW, uri);

context.startActivity(i);

}

函数调用方法:

[java] view
plain copy

callSomePhone(MainActivity.this, "tel:15958003646");

6.发短信

[java] view
plain copy

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);*/

}

函数调用方法:

[java] view
plain copy

sendAMessage(MainActivity.this, "smsto:12345678");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: