fix(target O): static broadcast receiver not working

This commit is contained in:
hyb1996 2018-10-06 14:08:00 +08:00
parent 8d2c0dd9f3
commit 51fedba26b
6 changed files with 130 additions and 37 deletions

View File

@ -144,11 +144,6 @@
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<action android:name="android.intent.action.TIME_SET"/>
<action android:name="android.intent.action.TIMEZONE_CHANGED"/>
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_CHANGED"/>
<action android:name="android.intent.action.PACKAGE_DATA_CLEARED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<action android:name="android.intent.action.PACKAGE_RESTARTED"/>
<action android:name="android.intent.action.UID_REMOVED"/>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>

View File

@ -13,11 +13,12 @@ import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v4.app.NotificationCompat;
import com.stardust.app.GlobalAppContext;
import org.autojs.autojs.R;
import org.autojs.autojs.ui.main.MainActivity_;
import java.lang.reflect.Array;
import java.util.Arrays;
public class ForegroundService extends Service {
@ -64,6 +65,7 @@ public class ForegroundService extends Service {
.setWhen(System.currentTimeMillis())
.setContentIntent(contentIntent)
.setChannelId(CHANEL_ID)
.setVibrate(new long[0])
.build();
}

View File

@ -4,10 +4,14 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.os.Build;
import android.util.Log;
import android.util.Pair;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@ -18,61 +22,110 @@ import static android.content.Intent.ACTION_PACKAGES_SUSPENDED;
import static android.content.Intent.ACTION_PACKAGES_UNSUSPENDED;
import static android.content.Intent.ACTION_SCREEN_OFF;
import static android.content.Intent.ACTION_SCREEN_ON;
import static android.content.Intent.ACTION_TIME_TICK;
public class DynamicBroadcastReceivers {
private static final List<String> DEFAULT_ACTIONS = new ArrayList<>(Arrays.asList(
ACTION_TIME_TICK,
ACTION_SCREEN_OFF,
ACTION_SCREEN_ON,
ACTION_BATTERY_CHANGED,
ACTION_CONFIGURATION_CHANGED
));
static {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
DEFAULT_ACTIONS.addAll(Arrays.asList(
ACTION_PACKAGES_SUSPENDED,
ACTION_PACKAGES_UNSUSPENDED
));
}
}
private static final String LOG_TAG = "DynBroadcastReceivers";
private final Set<String> mActions = new LinkedHashSet<>();
private final List<BroadcastReceiver> mReceivers = new ArrayList<>();
private final List<ReceiverRegistry> mReceiverRegistries = new ArrayList<>();
private final BaseBroadcastReceiver mDefaultActionReceiver = new BaseBroadcastReceiver();
private final BaseBroadcastReceiver mPackageActionReceiver = new BaseBroadcastReceiver();
private final Context mContext;
public DynamicBroadcastReceivers(Context context) {
mContext = context;
register(DEFAULT_ACTIONS);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mContext.registerReceiver(mDefaultActionReceiver, createIntentFilter(StaticBroadcastReceiver.ACTIONS));
IntentFilter filter = createIntentFilter(StaticBroadcastReceiver.PACKAGE_ACTIONS);
filter.addDataScheme("package");
mContext.registerReceiver(mPackageActionReceiver, filter);
}
}
public void register(String action) {
register(Collections.singletonList(action));
}
public void register(List<String> actions) {
IntentFilter filter = new IntentFilter();
public synchronized void register(List<String> actions) {
LinkedHashSet<String> newActions = new LinkedHashSet<>();
for (String action : actions) {
if (!StaticBroadcastReceiver.ACTIONS.contains(action)
&& !StaticBroadcastReceiver.PACKAGE_ACTIONS.contains(action)
&& !mActions.contains(action)) {
mActions.add(action);
filter.addAction(action);
newActions.add(action);
}
}
if (filter.countActions() == 0) {
if (newActions.isEmpty()) {
return;
}
BaseBroadcastReceiver receiver = new BaseBroadcastReceiver();
mContext.registerReceiver(receiver, filter);
ReceiverRegistry receiverRegistry = new ReceiverRegistry(newActions);
receiverRegistry.register();
mReceiverRegistries.add(receiverRegistry);
}
public void unregisterAll() {
for (BroadcastReceiver receiver : mReceivers) {
public synchronized void unregister(String action) {
if (!mActions.contains(action)) {
return;
}
mActions.remove(action);
Iterator<ReceiverRegistry> iterator = mReceiverRegistries.iterator();
while (iterator.hasNext()) {
ReceiverRegistry receiverRegistry = iterator.next();
if (!receiverRegistry.actions.contains(action)) {
continue;
}
receiverRegistry.actions.remove(action);
receiverRegistry.unregister();
if (!receiverRegistry.register()) {
iterator.remove();
}
break;
}
}
public synchronized void unregisterAll() {
for (ReceiverRegistry registry : mReceiverRegistries) {
registry.unregister();
}
mReceiverRegistries.clear();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mContext.unregisterReceiver(mDefaultActionReceiver);
mContext.unregisterReceiver(mPackageActionReceiver);
}
}
static IntentFilter createIntentFilter(Collection<String> actions) {
IntentFilter filter = new IntentFilter();
for (String action : actions) {
filter.addAction(action);
}
return filter;
}
private class ReceiverRegistry {
BroadcastReceiver receiver;
LinkedHashSet<String> actions;
ReceiverRegistry(LinkedHashSet<String> actions) {
this.actions = actions;
receiver = new BaseBroadcastReceiver();
}
void unregister() {
mContext.unregisterReceiver(receiver);
}
mReceivers.clear();
boolean register() {
if (actions.isEmpty())
return false;
IntentFilter intentFilter = createIntentFilter(actions);
mContext.registerReceiver(receiver, intentFilter);
Log.d(LOG_TAG, "register: " + actions);
return true;
}
}
}

View File

@ -37,4 +37,12 @@ public class StaticBroadcastReceiver extends BaseBroadcastReceiver {
"android.net.conn.CONNECTIVITY_CHANGE"
));
static final List<String> PACKAGE_ACTIONS = new ArrayList<>(Arrays.asList(
"android.intent.action.PACKAGE_ADDED",
"android.intent.action.PACKAGE_CHANGED",
"android.intent.action.PACKAGE_DATA_CLEARED",
"android.intent.action.PACKAGE_REMOVED",
"android.intent.action.PACKAGE_RESTARTED"
));
}

View File

@ -94,7 +94,12 @@ public class TimedTaskManager {
@SuppressLint("CheckResult")
public void removeTask(IntentTask intentTask) {
mIntentTaskDatabase.delete(intentTask)
.subscribe(EmptyObservers.consumer(), Throwable::printStackTrace);;
.subscribe(i -> {
if(!TextUtils.isEmpty(intentTask.getAction())){
App.getApp().getDynamicBroadcastReceivers()
.unregister(intentTask.getAction());
}
}, Throwable::printStackTrace);
}
public Flowable<TimedTask> getAllTasks() {

View File

@ -6,6 +6,7 @@ import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
@ -48,6 +49,7 @@ public class
EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost, PermissionRequestProxyActivity {
private OnActivityResultDelegate.Mediator mMediator = new OnActivityResultDelegate.Mediator();
private static final String LOG_TAG = "EditActivity";
@ViewById(R.id.editor_view)
EditorView mEditorView;
@ -125,6 +127,7 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
Log.d(LOG_TAG, "onPrepareOptionsMenu: " + menu);
boolean isScriptRunning = mEditorView.getScriptExecutionId() != ScriptExecution.NO_ID;
MenuItem forceStopItem = menu.findItem(R.id.action_force_stop);
forceStopItem.setEnabled(isScriptRunning);
@ -132,6 +135,7 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo
}
public boolean onPrepareActionMode(Menu menu) {
Log.d(LOG_TAG, "onPrepareActionMode: " + menu);
boolean isScriptRunning = mEditorView.getScriptExecutionId() != ScriptExecution.NO_ID;
MenuItem forceStopItem = menu.findItem(R.id.action_force_stop);
forceStopItem.setEnabled(isScriptRunning);
@ -140,6 +144,7 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo
@Override
public void onActionModeStarted(ActionMode mode) {
Log.d(LOG_TAG, "onActionModeStarted: " + mode);
Menu menu = mode.getMenu();
MenuItem item = menu.getItem(menu.size() - 1);
menu.add(item.getGroupId(), R.id.action_delete_line, 10000, R.string.text_delete_line);
@ -147,6 +152,31 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo
super.onActionModeStarted(mode);
}
@Override
public void onSupportActionModeStarted(@NonNull android.support.v7.view.ActionMode mode) {
Log.d(LOG_TAG, "onSupportActionModeStarted: mode = " + mode);
super.onSupportActionModeStarted(mode);
}
@Nullable
@Override
public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(@NonNull android.support.v7.view.ActionMode.Callback callback) {
Log.d(LOG_TAG, "onWindowStartingSupportActionMode: callback = " + callback);
return super.onWindowStartingSupportActionMode(callback);
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback, int type) {
Log.d(LOG_TAG, "startActionMode: callback = " + callback + ", type = " + type);
return super.startActionMode(callback, type);
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
Log.d(LOG_TAG, "startActionMode: callback = " + callback );
return super.startActionMode(callback);
}
@Override
public void onBackPressed() {
if (!mEditorView.onBackPressed()) {