【问题标题】:JobIntentService not starting properlyJobIntentService 未正常启动
【发布时间】:2018-03-16 10:21:35
【问题描述】:

在 com.example.project.packageA 包中,我有一个扩展 JobIntentService 的类,定义如下:

public class MyService extends JobIntentService {

    static final int JOB_ID = 1000;
    static final String TAG =MyService.class.getSimpleName();

    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, MyService.class, JOB_ID, work);
    }

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

        @Override
    public void onDestroy() {
        super.onDestroy();
    }

    /**
     * We have received work to do.  The system or framework is already
     * holding a wake lock for us at this point, so we can just go.
     */
    @Override
    protected void onHandleWork(Intent intent) {
        Log.i(TAG, "Started onHandleWork");
        String value = intent.getExtras().getString("Key");
        Log.i(TAG, value);
    }

}

在另一个包中: com.example.project.packageB;我想调用这个服务在后台启动,所以我这样做了:

Intent it = new Intent();
it.setComponent(new ComponentName("com.example.project", "com.example.project.packageA.MyService"));
it.putExtra("Key", "Value");
MyService.enqueueWork(context, it);
Log.d(TAG, "Call successful");

我还在清单文件中包含以下权限:

<service
    android:name="com.example.project.MyService"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:exported="true"/>

但是,当我运行我的程序时,它看起来并没有启动服务。我可以看到日志消息“呼叫成功”,但我看不到来自 onHandleWork 函数的日志消息。我是否以错误的方式启动服务?

【问题讨论】:

  • 你解决了这个问题吗?
  • 如果您使用过,请从 JobIntentService 中移除 onBind 和 onCreate 方法。

标签: android service jobservice


【解决方案1】:

在更高版本的 Android 中,Google 引入了 Doze 功能以优化设备的电池寿命。 (不确定他们是从哪个版本引入的)您需要将此添加到您的意图中以忽略电池优化

//禁用电池优化

Intent intent = new Intent(this,SeriesService.class);
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    if (pm.isIgnoringBatteryOptimizations(packageName))
            intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
    else {      intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + packageName));
    }
startService(intent);

我在我的 OnePlus 5(运行 Android pie)上试过这个,它可以工作

编辑

以防万一我在启动服务后添加调用方式

Context con = getView().getContext();//activity context
Intent intent = new Intent(con,SeriesService.class);
intent.setAction(SOME_ACTION);
intent.putExtra(KEY,data);
SeriesService.enqueueWork(con,intent);

【讨论】:

  • 这个答案救了我! :-)
【解决方案2】:

您无需在意图中使用组件名称。尝试删除此行:

it.setComponent(new ComponentName("com.example.project", "com.example.project.packageA.MyService"));

你的代码也应该是这样的:

Intent it = new Intent();
it.putExtra("Key", "Value");
MyService.enqueueWork(context, it);
Log.d(TAG, "Call successful");

【讨论】:

    【解决方案3】:

    考虑这样开始;

    Intent it = new Intent(context, MyService.class);
    it.putExtra("key", "value");
    MyService.enqueueWork(context, it);
    

    【讨论】:

      【解决方案4】:

      如果您覆盖方法 onCreate(),则永远不会调用方法 onHandleWork()。只需删除 onCreate() 方法即可。

      【讨论】:

        猜你喜欢
        • 2019-02-27
        • 2019-09-12
        • 2018-02-18
        • 1970-01-01
        • 2018-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-16
        相关资源
        最近更新 更多