【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");
在我们日常使用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");
相关文章推荐
- Android 自定义AlertDialog提交表单
- DrawerLayout的导航图标详解
- Android Studio NDK-Jni开发小Demo
- Android 广播机制
- android studio下载地址
- 得到某个数据库的路径 删除APP中所有的数据
- android:shape属性详解
- Android IPC机制(四):细说Binder连接池
- android 启动Activity的四种模式
- Android唤醒屏幕
- swift nsarray中加nsarray、NSMutableArray
- 微信朋友圈图片处理策略
- iOS 一套@3x图片兼容所有iOS设备和系统
- Android Studio 环境配置优化
- Android 代码动态改变View的属性
- iOS开发总结之自定义等高cell03-xib
- Android Custom View Tutorial (Part 4) – Animation
- FFmpeg在iOS mac 终端上下载
- 如何处理 android 方法总数超过 65536 . the number of method references in a .dex file exceed 64k
- Android使用WebView加载本地图片终极大杀招