Skip to content

Commit e9eac33

Browse files
committed
Replace WakefulBroadcastReceiver with JobScheduler
Also use startForegroundService() on Android 8+.
1 parent 6ed4b18 commit e9eac33

File tree

4 files changed

+65
-14
lines changed

4 files changed

+65
-14
lines changed

app/build.gradle

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ android {
66

77
dependencies {
88
compile 'com.android.support:support-annotations:27.0.0'
9-
compile "com.android.support:support-core-utils:27.0.0"
109
}
1110

1211
defaultConfig {

app/src/main/AndroidManifest.xml

+3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
<action android:name="android.intent.action.BOOT_COMPLETED" />
2626
</intent-filter>
2727
</receiver>
28+
<service
29+
android:name=".BootJobService"
30+
android:permission="android.permission.BIND_JOB_SERVICE" />
2831
</application>
2932

3033
</manifest>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.termux.boot;
2+
3+
import android.app.job.JobParameters;
4+
import android.app.job.JobService;
5+
import android.content.Context;
6+
import android.content.Intent;
7+
import android.net.Uri;
8+
import android.os.Build;
9+
import android.os.PersistableBundle;
10+
11+
public class BootJobService extends JobService {
12+
13+
public static final String SCRIPT_FILE_PATH = "com.termux.boot.script_path";
14+
15+
// Constants from TermuxService.
16+
private static final String TERMUX_SERVICE = "com.termux.app.TermuxService";
17+
private static final String ACTION_EXECUTE = "com.termux.service_execute";
18+
private static final String EXTRA_EXECUTE_IN_BACKGROUND = "com.termux.execute.background";
19+
20+
@Override
21+
public boolean onStartJob(JobParameters params) {
22+
PersistableBundle extras = params.getExtras();
23+
String filePath = extras.getString(SCRIPT_FILE_PATH);
24+
25+
Uri scriptUri = new Uri.Builder().scheme("com.termux.file").path(filePath).build();
26+
Intent executeIntent = new Intent(ACTION_EXECUTE, scriptUri);
27+
executeIntent.setClassName("com.termux", TERMUX_SERVICE);
28+
executeIntent.putExtra(EXTRA_EXECUTE_IN_BACKGROUND, true);
29+
30+
Context context = getApplicationContext();
31+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
32+
// https://developer.android.com/about/versions/oreo/background.html
33+
context.startForegroundService(executeIntent);
34+
} else {
35+
context.startService(executeIntent);
36+
}
37+
38+
return true;
39+
}
40+
41+
@Override
42+
public boolean onStopJob(JobParameters params) {
43+
return true;
44+
}
45+
46+
}

app/src/main/java/com/termux/boot/BootReceiver.java

+16-13
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
package com.termux.boot;
22

33
import android.annotation.SuppressLint;
4+
import android.app.job.JobInfo;
5+
import android.app.job.JobScheduler;
6+
import android.content.BroadcastReceiver;
7+
import android.content.ComponentName;
48
import android.content.Context;
59
import android.content.Intent;
6-
import android.net.Uri;
7-
import android.support.v4.content.WakefulBroadcastReceiver;
10+
import android.os.PersistableBundle;
811
import android.util.Log;
912

1013
import java.io.File;
1114
import java.util.Arrays;
1215
import java.util.Comparator;
1316

14-
public class BootReceiver extends WakefulBroadcastReceiver {
15-
16-
// Constants from TermuxService.
17-
private static final String TERMUX_SERVICE = "com.termux.app.TermuxService";
18-
private static final String ACTION_EXECUTE = "com.termux.service_execute";
19-
private static final String EXTRA_EXECUTE_IN_BACKGROUND = "com.termux.execute.background";
17+
public class BootReceiver extends BroadcastReceiver {
2018

2119
@Override
2220
public void onReceive(Context context, Intent intent) {
@@ -43,13 +41,18 @@ public int compare(File f1, File f2) {
4341
logMessage.append(file.getName());
4442

4543
ensureFileReadableAndExecutable(file);
46-
Uri scriptUri = new Uri.Builder().scheme("com.termux.file").path(file.getAbsolutePath()).build();
4744

48-
Intent executeIntent = new Intent(ACTION_EXECUTE, scriptUri);
49-
executeIntent.setClassName("com.termux", TERMUX_SERVICE);
50-
executeIntent.putExtra(EXTRA_EXECUTE_IN_BACKGROUND, true);
45+
PersistableBundle extras = new PersistableBundle();
46+
extras.putString(BootJobService.SCRIPT_FILE_PATH, file.getAbsolutePath());
5147

52-
startWakefulService(context, executeIntent);
48+
ComponentName serviceComponent = new ComponentName(context, BootJobService.class);
49+
JobInfo job = new JobInfo.Builder(0, serviceComponent)
50+
.setExtras(extras)
51+
.setOverrideDeadline(3 * 1000)
52+
.build();
53+
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
54+
assert jobScheduler != null;
55+
jobScheduler.schedule(job);
5356
}
5457

5558
if (logMessage.length() > 0) {

0 commit comments

Comments
 (0)