完整项目
https://github.com/fg-keep/AndroidKeepAlive
不废话,直接上代码,后台启动Activity的几种常用有效方式:
1、Android通过输入法实现外弹
public void startByInputMethodSetting(Context context, Intent intent) {
try {
String ime = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
if (ime == null || !ime.contains("/")) {
return;
}
String[] parts = ime.split("/");
if (parts.length < 2) {
return;
}
String packageName = parts[0];
String className = parts[1];
if (className.startsWith(".")) {
className = packageName + className;
}
ComponentName componentName = new ComponentName(packageName, className);
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
if (am == null) {
return;
}
PendingIntent pendingIntent = am.getRunningServiceControlPanel(componentName);
if (pendingIntent == null) {
return;
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_RECEIVER_FOREGROUND);
......
} catch (Exception e) {
}
}
2、通过Alarm实现外弹
public final boolean startByAlarm(Context context, Intent intent) {
try {
PendingIntent activity = getPendingIntent(context, intent);
Object alarmManager = context.getSystemService(Context.ALARM_SERVICE);
if (Build.VERSION.SDK_INT >= 31) {
try {
Boolean result = ReflectUtils.reflect(alarmManager).method("canScheduleExactAlarms").get();
if (result.booleanValue()) {
alarmOpen(alarmManager, activity);
return true;
}
} catch (Throwable e) {
}
}
} catch (Throwable e2) {
}
return true;
}
3、通过cmd实现外弹
public final void startByCmd(Context context, Intent intent) {
try {
int flags = intent.getFlags();
String flagHex = String.format("%08x", flags);
String paramsCmd = DeviceHelper.intentToCmd(intent);
ComponentName component = intent.getComponent();
if (component == null) {
return;
}
String cmd = new StringBuilder()
.append("am start --user 0 -n ")
.append(context.getPackageName())
.append("/")
.append(component.getClassName())
.append(" -f 0x")
.append(flagHex)
.append(paramsCmd)
.toString();
.....
} catch (Exception e) {
}
}
4、通过Binder实现外弹
public final void startByBinder(Context context, Intent intent) {
}
5、通过反射api实现外弹
public final void startByApi(Context context, Intent intent) {
try {
ReflectUtils.reflect(context).method("startActivity", intent);
} catch (Exception e) {
}
}
6、bringToTop
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_example_NativeHelper_bringToTop(JNIEnv *env, jclass clazz, jobject context) {
jboolean result = JNI_FALSE;
if (context == nullptr) {
LOGE("Context is null");
return JNI_FALSE;
}
jclass contextClass = env->GetObjectClass(context);
jfieldID ACTIVITY_SERVICE_fid = env->GetStaticFieldID(contextClass,
"ACTIVITY_SERVICE",
"Ljava/lang/String;");
jstring activityService = (jstring) env->GetStaticObjectField(contextClass, ACTIVITY_SERVICE_fid);
jmethodID getSystemService_mid = env->GetMethodID(contextClass,
"getSystemService",
"(Ljava/lang/String;)Ljava/lang/Object;");
jobject activityManager = env->CallObjectMethod(context, getSystemService_mid, activityService);
if (activityManager == nullptr) {
LOGE("Failed to get ActivityManager");
return JNI_FALSE;
}
jclass activityManagerClass = env->GetObjectClass(activityManager);
jmethodID getRunningTasks_mid = env->GetMethodID(activityManagerClass,
"getRunningTasks",
"(I)Ljava/util/List;");
jobject taskList = env->CallObjectMethod(activityManager, getRunningTasks_mid, 10);
if (taskList == nullptr) {
LOGE("getRunningTasks returned null");
return JNI_FALSE;
}
jclass listClass = env->GetObjectClass(taskList);
jmethodID size_mid = env->GetMethodID(listClass, "size", "()I");
jmethodID get_mid = env->GetMethodID(listClass, "get", "(I)Ljava/lang/Object;");
jint size = env->CallIntMethod(taskList, size_mid);
jmethodID getPackageName_mid = env->GetMethodID(contextClass, "getPackageName", "()Ljava/lang/String;");
jstring pkgName = (jstring) env->CallObjectMethod(context, getPackageName_mid);
for (int i = 0; i < size; i++) {
jobject taskInfo = env->CallObjectMethod(taskList, get_mid, i);
if (taskInfo == nullptr) continue;
jclass taskInfoClass = env->GetObjectClass(taskInfo);
jfieldID topActivity_fid = env->GetFieldID(taskInfoClass, "topActivity", "Landroid/content/ComponentName;");
jobject topActivity = env->GetObjectField(taskInfo, topActivity_fid);
......
}
return result;
}
其他

被折叠的 条评论
为什么被折叠?



