|
|
|
|
@ -1,19 +1,17 @@ |
|
|
|
|
package com.github.catvod.spider; |
|
|
|
|
|
|
|
|
|
import android.Manifest; |
|
|
|
|
import android.app.Activity; |
|
|
|
|
import android.app.Application; |
|
|
|
|
import android.content.Context; |
|
|
|
|
import android.content.pm.PackageManager; |
|
|
|
|
import android.os.Build; |
|
|
|
|
import android.os.Bundle; |
|
|
|
|
import android.os.Handler; |
|
|
|
|
import android.os.Looper; |
|
|
|
|
|
|
|
|
|
import androidx.annotation.NonNull; |
|
|
|
|
import androidx.annotation.Nullable; |
|
|
|
|
|
|
|
|
|
import com.github.catvod.crawler.SpiderDebug; |
|
|
|
|
import com.github.catvod.utils.Notify; |
|
|
|
|
|
|
|
|
|
import java.lang.reflect.Field; |
|
|
|
|
import java.util.Map; |
|
|
|
|
import java.util.concurrent.ExecutorService; |
|
|
|
|
import java.util.concurrent.Executors; |
|
|
|
|
|
|
|
|
|
@ -21,6 +19,7 @@ public class Init { |
|
|
|
|
|
|
|
|
|
private final ExecutorService executor; |
|
|
|
|
private final Handler handler; |
|
|
|
|
private Activity activity; |
|
|
|
|
private Application app; |
|
|
|
|
|
|
|
|
|
private static class Loader { |
|
|
|
|
@ -40,9 +39,18 @@ public class Init { |
|
|
|
|
return get().app; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static Activity activity() { |
|
|
|
|
return get().activity; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setActivity(Activity activity) { |
|
|
|
|
this.activity = activity; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void init(Context context) { |
|
|
|
|
get().app = ((Application) context); |
|
|
|
|
SpiderDebug.log("自定義爬蟲代碼載入成功!"); |
|
|
|
|
registerActivityLifecycleCallbacks(); |
|
|
|
|
Proxy.init(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -58,32 +66,41 @@ public class Init { |
|
|
|
|
get().handler.postDelayed(runnable, delay); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void checkPermission() { |
|
|
|
|
try { |
|
|
|
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return; |
|
|
|
|
if (context().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) return; |
|
|
|
|
Notify.show("請允許儲存權限"); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
private static void registerActivityLifecycleCallbacks() { |
|
|
|
|
get().app.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { |
|
|
|
|
@Override |
|
|
|
|
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { |
|
|
|
|
if (activity != activity()) get().setActivity(activity); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void onActivityStarted(@NonNull Activity activity) { |
|
|
|
|
if (activity != activity()) get().setActivity(activity); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void onActivityResumed(@NonNull Activity activity) { |
|
|
|
|
if (activity != activity()) get().setActivity(activity); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void onActivityPaused(@NonNull Activity activity) { |
|
|
|
|
if (activity == activity()) get().setActivity(null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void onActivityStopped(@NonNull Activity activity) { |
|
|
|
|
if (activity == activity()) get().setActivity(null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void onActivityDestroyed(@NonNull Activity activity) { |
|
|
|
|
if (activity == activity()) get().setActivity(null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static Activity getActivity() throws Exception { |
|
|
|
|
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread"); |
|
|
|
|
Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null); |
|
|
|
|
Field activitiesField = activityThreadClass.getDeclaredField("mActivities"); |
|
|
|
|
activitiesField.setAccessible(true); |
|
|
|
|
Map<?, ?> activities = (Map<?, ?>) activitiesField.get(activityThread); |
|
|
|
|
for (Object o : activities.values()) { |
|
|
|
|
Class<?> clz = o.getClass(); |
|
|
|
|
Field pausedField = clz.getDeclaredField("paused"); |
|
|
|
|
pausedField.setAccessible(true); |
|
|
|
|
if (!pausedField.getBoolean(o)) { |
|
|
|
|
Field activityField = clz.getDeclaredField("activity"); |
|
|
|
|
activityField.setAccessible(true); |
|
|
|
|
return (Activity) activityField.get(o); |
|
|
|
|
@Override |
|
|
|
|
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|