Возникла проблема с Intent при реализации фонового сервиса для реактивного приложения с использованием безголового js - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь внедрить фоновый сервис для моего реактивного приложения, используя безголовый JS, вызывая собственный собственный модуль Android.Но я столкнулся с проблемой с Intent, которую я использую для запуска службы Intent, когда приложение работает в фоновом режиме.

Пожалуйста, помогите мне исправить это.Я javascript разработчик, поэтому мне сложно понять поток данных в java и android.

Я создал файл MytaskService.java в com.native_app и добавил этот сервис в AndroidMenifest.xml.Также создан специальный модуль, в котором я пишу код для запуска моего сервиса с помощью Intent и здесь сталкиваюсь с проблемой. Мой сервис не запускается, когда приложение переходит в фоновый режим.

MyTaskService.java

   package com.native_app;

   import android.content.Intent;
   import android.os.Bundle;
   import com.facebook.react.HeadlessJsTaskService;
   import com.facebook.react.bridge.Arguments;
   import com.facebook.react.jstasks.HeadlessJsTaskConfig;
   import com.facebook.react.bridge.WritableMap;

   public class MyTaskService extends HeadlessJsTaskService {
       @Override
       protected HeadlessJsTaskConfig getTaskConfig(Intent intent) {
       Bundle extras = intent.getExtras();
       WritableMap data = extras != null ? Arguments.fromBundle(extras) 
         : null;
       return new HeadlessJsTaskConfig(
           "mytask", //<- this is my javascript task
           data,
           5000,
           true);
    };

}

AndroidMenifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.native_app">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:allowBackup="false"
      android:theme="@style/AppTheme">
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:windowSoftInputMode="adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
      </activity>
      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />

    //<- my service
      <service android:name="com.native_app.MyTaskService" android:enabled="true" android:label="MyTaskService" /> 
    </application>

</manifest>

BackgroundTaskModule.java

public class BackgroundTaskModule extends ReactContextBaseJavaModule{
        public BackgroundTaskModule(ReactApplicationContext reactContext){
            super(reactContext);
        };
        @Override
        public String getName(){
            return "BackgroundTask";
        };

        @ReactMethod
        public void headless(Context context, Intent intent) {

            if (!isAppOnForeground((context))) {
                Intent serviceIntent = new Intent(context, MyTaskService.class);
                serviceIntent.putExtra("hello", "ankit dubey");
                context.startService(serviceIntent);
                HeadlessJsTaskService.acquireWakeLockNow(context);
            }
        }

        private boolean isAppOnForeground(Context context) {
            ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningAppProcessInfo> appProcesses =
            activityManager.getRunningAppProcesses();
            if (appProcesses == null) {
                return false;
            }
            final String packageName = context.getPackageName();
            for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
                if (appProcess.importance ==
                ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
                 appProcess.processName.equals(packageName)) {
                    return true;
                }
            }
            return false;
        }
};

Я создал задачу javascript в своем реактивном приложении с именем «mytask» в App.js и зарегистрировал ее.

Пожалуйста, дайте мне знать, что я делаюнеправильно.

...