使用无头js为React-native应用实现后台服务时,Intent面临的问题

时间:2019-04-22 07:29:43

标签: android react-native react-native-android

我正在尝试通过调用android自定义本机模块,使用无头JS为我的react-native应用程序实现后台服务。但是面对Intent的问题,当应用在后台运行时,我正用来启动Intent服务。

请帮助我解决此问题。我是 javascript 开发人员,因此很难理解Java和android中的数据流。

我已经在com.native_app中创建了MytaskService.java文件,并将此服务添加到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;
        }
};

我已经在我的react-native应用程序中创建了一个JavaScript任务,并在App.js中将其命名为“ mytask”。

请让我知道我做错了。

0 个答案:

没有答案