【问题标题】:Start a JobIntentService Implicitly隐式启动 JobIntentService
【发布时间】:2019-02-27 23:04:04
【问题描述】:

如你所知,这就是我们解雇JobIntentService的方式:

JobIntentService.enqueueWork(this,
                        MyJobIntentService.class,
                        JOB_ID, 
                        intent);

在这种方法中,我们知道我们要启动哪个服务并将其类传递给方法。
这是我的问题有没有启动服务的方式 隐式
我为什么需要这个?我正在开发一个库,有时应该启动开发人员扩展的服务,显然我无法从库中访问它
我尝试了什么?我使用IntentService(使用意图过滤器)实现了它,并且在 O 之前的设备上运行良好,但对于 Android Oreo 我收到了这个崩溃日志:

致命异常:java.lang.IllegalStateException:不允许启动 服务意图 { act=someAction pkg=somePackage (has extras) }: 应用在后台 uid UidRecord{de24eda u0a238 RCVR idle procs:1 seq(0,0,0)}

所以我搬到JobIntentService,现在的问题是我无法隐式启动它。
任何解决方案或替代方案将不胜感激。

【问题讨论】:

    标签: android android-8.0-oreo jobintentservice


    【解决方案1】:

    好吧,我找到了解决方案,首先查询您要查找的服务并检查是否具有JobIntentService 的必要权限,然后排队工作:

    private final String PERMISSION_BIND_JOB_SERVICE = "android.permission.BIND_JOB_SERVICE";
    Intent handlerIntent = new Intent(MY_ACTION);
    List<ResolveInfo> result =
            getPackageManager().queryIntentServices(handlerIntent, 0);
                if (result.size() > 0) {
        ResolveInfo info = result.get(0);
        if (info != null && info.serviceInfo != null &&
                info.serviceInfo.permission != null){
            String permission = info.serviceInfo.permission;
            if (permission.equals(PERMISSION_BIND_JOB_SERVICE)) {
                try {
                    Class<?> serviceClass = Class.forName(info.serviceInfo.name);
                    JobIntentService.enqueueWork(this,
                            serviceClass,
                            JOB_ID, handlerIntent);
    
                } catch (ClassNotFoundException e) {
                    //Handle exception if you will
                }
            }
        }
    }
    

    在应用程序模块清单中,我也将android.permission.BIND_JOB_SERVICE 添加到我的服务中:

    <service
        android:name=".MyService"
        android:enabled="true"
        android:permission="android.permission.BIND_JOB_SERVICE"
        android:exported="false">
        <intent-filter>
            <action android:name="MY_ACTION" />
        </intent-filter>
    </service>
    

    【讨论】:

    • 很抱歉问了一个愚蠢的问题,但这究竟是如何工作的?这可以在不使用意图和意图过滤器的情况下完成吗?如果我在 Intent 服务中有多个函数根据我在 Intent 中传递的数据执行不同的操作,那么我该如何实现呢?
    • 您可以使用 Bundle 对象将您的命令作为其参数来定义您需要完成的功能。
    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2018-04-02
    • 2014-03-24
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多