我正在尝试通过调用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”。
请让我知道我做错了。