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.QUICKBOOT_POWERON" />
<action android:name="android.intent.action.TIME_SET"/> <action android:name="android.intent.action.TIME_SET"/>
<action android:name="android.intent.action.TIMEZONE_CHANGED"/> <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.UID_REMOVED"/>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> <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.annotation.RequiresApi;
import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat;
import com.stardust.app.GlobalAppContext;
import org.autojs.autojs.R; import org.autojs.autojs.R;
import org.autojs.autojs.ui.main.MainActivity_; import org.autojs.autojs.ui.main.MainActivity_;
import java.lang.reflect.Array;
import java.util.Arrays;
public class ForegroundService extends Service { public class ForegroundService extends Service {
@@ -64,6 +65,7 @@ public class ForegroundService extends Service {
.setWhen(System.currentTimeMillis()) .setWhen(System.currentTimeMillis())
.setContentIntent(contentIntent) .setContentIntent(contentIntent)
.setChannelId(CHANEL_ID) .setChannelId(CHANEL_ID)
.setVibrate(new long[0])
.build(); .build();
} }

View File

@@ -4,10 +4,14 @@ import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.os.Build; import android.os.Build;
import android.util.Log;
import android.util.Pair;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Set; 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_PACKAGES_UNSUSPENDED;
import static android.content.Intent.ACTION_SCREEN_OFF; import static android.content.Intent.ACTION_SCREEN_OFF;
import static android.content.Intent.ACTION_SCREEN_ON; import static android.content.Intent.ACTION_SCREEN_ON;
import static android.content.Intent.ACTION_TIME_TICK;
public class DynamicBroadcastReceivers { public class DynamicBroadcastReceivers {
private static final List<String> DEFAULT_ACTIONS = new ArrayList<>(Arrays.asList( private static final String LOG_TAG = "DynBroadcastReceivers";
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 final Set<String> mActions = new LinkedHashSet<>(); 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; private final Context mContext;
public DynamicBroadcastReceivers(Context context) { public DynamicBroadcastReceivers(Context context) {
mContext = 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) { public void register(String action) {
register(Collections.singletonList(action)); register(Collections.singletonList(action));
} }
public void register(List<String> actions) { public synchronized void register(List<String> actions) {
IntentFilter filter = new IntentFilter(); LinkedHashSet<String> newActions = new LinkedHashSet<>();
for (String action : actions) { for (String action : actions) {
if (!StaticBroadcastReceiver.ACTIONS.contains(action) if (!StaticBroadcastReceiver.ACTIONS.contains(action)
&& !StaticBroadcastReceiver.PACKAGE_ACTIONS.contains(action)
&& !mActions.contains(action)) { && !mActions.contains(action)) {
mActions.add(action); newActions.add(action);
filter.addAction(action);
} }
} }
if (filter.countActions() == 0) { if (newActions.isEmpty()) {
return; return;
} }
BaseBroadcastReceiver receiver = new BaseBroadcastReceiver(); ReceiverRegistry receiverRegistry = new ReceiverRegistry(newActions);
mContext.registerReceiver(receiver, filter); receiverRegistry.register();
mReceiverRegistries.add(receiverRegistry);
} }
public void unregisterAll() { public synchronized void unregister(String action) {
for (BroadcastReceiver receiver : mReceivers) { 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); 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" "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") @SuppressLint("CheckResult")
public void removeTask(IntentTask intentTask) { public void removeTask(IntentTask intentTask) {
mIntentTaskDatabase.delete(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() { public Flowable<TimedTask> getAllTasks() {

View File

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