Android调用外部程序的服务Service

A程序里,使用intent来打开外部应用

举例:可以有两种方式

比如我要打开系统闹钟

1、 intent.setClassName(包名, 包名+activity名);


    Intent intent = new Intent();
    intent.setClassName("com.android.deskclock","com.android.deskclock.DeskClock");
    startActivity(intent);

2、除了通过setClassName(),还可以用setComponent()来打开外部程序,可以传递一个ComponentName对象,该对象有一个接受2个参数的构造方法,第一参数传递目标Service所在的包名,第二个参数传递目标Service的完整类名.

intent.setComponent(new ComponentName("com.android.deskclock","com.android.deskclock.DeskClock"));

setClassName内部也是调用的setComponent。

这里我们使用setComponent来调用另一个app的服务

{
            try {
                String PACKAGE_NAME = "com.tiidian.seed.normal";
                String SERVICE_NAME = "com.tiidian.seed.service.SeedService";//com.tiidian.seed.service.SeedService
                String ACTION_INSTALL_APK = "ACTION.INSTALL_APK";
                String INSTALL_APK_EXTRA_PATH = "apk_file";
                String INSTALL_APK_EXTRA_START = "start_app";

                Intent i = new Intent();
                i.setComponent(new ComponentName(PACKAGE_NAME, SERVICE_NAME));
                i.setAction(ACTION_INSTALL_APK);
                i.putExtra(INSTALL_APK_EXTRA_PATH, Setting.SD_APK_PATH + File.separator + info.getVersionCode() + ".apk");
                i.putExtra(INSTALL_APK_EXTRA_START, true);
                context.getApplicationContext().startService(i);
            } catch (Exception e) {
                e.printStackTrace();
            }
            }

B程序里,在SeedService里接收Intent,做出处理


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null && !TextUtils.isEmpty(intent.getAction())) {
            switch (intent.getAction()) {            
                case ACTION_INSTALL_APK:
                    installExternalAPK(intent);
                    break;
                default:   
                    break;
            }
        }, 
    }

注意:如果遇到Unable to start service Intent { cmp=…/…}: not found
解决方法
1.检查AndroidManifest.xml配置文件中是否配置了service
2.检查service 是否在application标签内
3.如果你的service和启动的activity不在同一个包内,需要把service标签中的android:name配置成service类的完全名
4.目标service需要声明exported=true 的属性,表示允许其他应用访问该服务.
5.android5.0之前是可以通过设置隐式意图来跨应用打开Service的,5.0之后就必须要通过显示意图来开启Service.

另外,查看包名小技巧,把app放到as下,双击

这里写图片描述

参考了:

https://blog.csdn.net/github_26672553/article/details/62883332

猜你喜欢

转载自blog.csdn.net/changhuzichangchang/article/details/80281177