├── app
├── .gitignore
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── values
│ │ │ │ ├── strings.xml
│ │ │ │ ├── colors.xml
│ │ │ │ ├── dimens.xml
│ │ │ │ └── styles.xml
│ │ │ ├── values-v21
│ │ │ │ └── styles.xml
│ │ │ ├── values-w820dp
│ │ │ │ └── dimens.xml
│ │ │ ├── menu
│ │ │ │ └── menu_main.xml
│ │ │ └── layout
│ │ │ │ ├── content_main.xml
│ │ │ │ └── activity_main.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── droidyue
│ │ │ │ └── getcurrentactivitydemo
│ │ │ │ ├── BaseActivity.java
│ │ │ │ ├── MyActivityManager.java
│ │ │ │ ├── MyApplication.java
│ │ │ │ └── MainActivity.java
│ │ └── AndroidManifest.xml
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── droidyue
│ │ │ └── getcurrentactivitydemo
│ │ │ └── ExampleUnitTest.java
│ └── androidTest
│ │ └── java
│ │ └── com
│ │ └── droidyue
│ │ └── getcurrentactivitydemo
│ │ └── ApplicationTest.java
├── proguard-rules.pro
└── build.gradle
├── settings.gradle
└── .gitignore
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/androidyue/GetCurrentActivityDemo/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/androidyue/GetCurrentActivityDemo/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/androidyue/GetCurrentActivityDemo/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/androidyue/GetCurrentActivityDemo/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/androidyue/GetCurrentActivityDemo/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | GetCurrentActivityDemo
3 | Settings
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 | 16dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v21/styles.xml:
--------------------------------------------------------------------------------
1 | >
2 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/java/com/droidyue/getcurrentactivitydemo/BaseActivity.java:
--------------------------------------------------------------------------------
1 | package com.droidyue.getcurrentactivitydemo;
2 |
3 | import android.app.Activity;
4 |
5 | /**
6 | * Created by androidyue on 2/9/16.
7 | */
8 | public class BaseActivity extends Activity{
9 |
10 | @Override
11 | protected void onResume() {
12 | super.onResume();
13 | MyActivityManager.getInstance().setCurrentActivity(this);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/test/java/com/droidyue/getcurrentactivitydemo/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.droidyue.getcurrentactivitydemo;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * To work on unit tests, switch the Test Artifact in the Build Variants view.
9 | */
10 | public class ExampleUnitTest {
11 | @Test
12 | public void addition_isCorrect() throws Exception {
13 | assertEquals(4, 2 + 2);
14 | }
15 | }
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/droidyue/getcurrentactivitydemo/ApplicationTest.java:
--------------------------------------------------------------------------------
1 | package com.droidyue.getcurrentactivitydemo;
2 |
3 | import android.app.Application;
4 | import android.test.ApplicationTestCase;
5 |
6 | /**
7 | * Testing Fundamentals
8 | */
9 | public class ApplicationTest extends ApplicationTestCase {
10 | public ApplicationTest() {
11 | super(Application.class);
12 | }
13 | }
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_main.xml:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/androidyue/common_tools/adt-bundle-mac-x86_64-20140702/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 23
5 | buildToolsVersion "23.0.2"
6 |
7 | defaultConfig {
8 | applicationId "com.droidyue.getcurrentactivitydemo"
9 | minSdkVersion 14
10 | targetSdkVersion 23
11 | versionCode 1
12 | versionName "1.0"
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | compile fileTree(dir: 'libs', include: ['*.jar'])
24 | testCompile 'junit:junit:4.12'
25 | compile 'com.android.support:appcompat-v7:23.1.1'
26 | compile 'com.android.support:design:23.1.1'
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
11 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Built application files
2 | *.apk
3 | *.ap_
4 |
5 |
6 | # files for the dex VM
7 | *.dex
8 |
9 |
10 | # Java class files
11 | *.class
12 |
13 | # generated files
14 | bin/
15 | gen/
16 | out
17 | lib
18 |
19 |
20 |
21 | # Gradle files
22 | build/
23 | .gradle
24 | gradlew.bat
25 | build
26 | gradle.properties
27 | gradle
28 | gradlew
29 |
30 |
31 | # Proguard folder generated by Eclipse
32 | proguard/
33 |
34 |
35 | # Log Files
36 | *.log
37 |
38 |
39 | ##Android Studio Ignore files
40 | /.idea/workspace.xml
41 | /.idea/libraries
42 | /captures
43 | .navigation/
44 |
45 |
46 | # IntelliJ IDEA
47 | .idea
48 | *.iml
49 | *.ipr
50 | *.iws
51 |
52 | # Local configuration file (sdk path, etc)
53 | local.properties
54 | reports
55 | jacoco.exec
56 |
57 |
58 | # Mac system files
59 | .DS_Store
60 |
61 |
62 |
63 |
64 |
65 |
66 | # Eclipse project files
67 | .classpath
68 | .project
69 | .settings/
70 | eclipsebin
71 | .metadata/
72 |
73 |
74 | #NDK
75 | obj/
76 | jniLibs
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/droidyue/getcurrentactivitydemo/MyActivityManager.java:
--------------------------------------------------------------------------------
1 | package com.droidyue.getcurrentactivitydemo;
2 |
3 | import android.app.Activity;
4 |
5 | import java.lang.ref.WeakReference;
6 |
7 | /**
8 | * Created by androidyue on 2/9/16.
9 | */
10 | public class MyActivityManager {
11 | private static MyActivityManager sInstance = new MyActivityManager();
12 | private WeakReference sCurrentActivityWeakRef;
13 |
14 |
15 | private MyActivityManager() {
16 |
17 | }
18 |
19 | public static MyActivityManager getInstance() {
20 | return sInstance;
21 | }
22 |
23 | public Activity getCurrentActivity() {
24 | Activity currentActivity = null;
25 | if (sCurrentActivityWeakRef != null) {
26 | currentActivity = sCurrentActivityWeakRef.get();
27 | }
28 | return currentActivity;
29 | }
30 |
31 | public void setCurrentActivity(Activity activity) {
32 | sCurrentActivityWeakRef = new WeakReference(activity);
33 | }
34 |
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
15 |
16 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/app/src/main/java/com/droidyue/getcurrentactivitydemo/MyApplication.java:
--------------------------------------------------------------------------------
1 | package com.droidyue.getcurrentactivitydemo;
2 |
3 | import android.app.Activity;
4 | import android.app.Application;
5 | import android.os.Bundle;
6 |
7 | /**
8 | * Created by androidyue on 2/9/16.
9 | */
10 | public class MyApplication extends Application {
11 |
12 |
13 | @Override
14 | public void onCreate() {
15 | super.onCreate();
16 | registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
17 | @Override
18 | public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
19 |
20 | }
21 |
22 | @Override
23 | public void onActivityStarted(Activity activity) {
24 |
25 | }
26 |
27 | @Override
28 | public void onActivityResumed(Activity activity) {
29 | MyActivityManager.getInstance().setCurrentActivity(activity);
30 | }
31 |
32 | @Override
33 | public void onActivityPaused(Activity activity) {
34 |
35 | }
36 |
37 | @Override
38 | public void onActivityStopped(Activity activity) {
39 |
40 | }
41 |
42 | @Override
43 | public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
44 |
45 | }
46 |
47 | @Override
48 | public void onActivityDestroyed(Activity activity) {
49 |
50 | }
51 | });
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/app/src/main/java/com/droidyue/getcurrentactivitydemo/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.droidyue.getcurrentactivitydemo;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.support.v7.widget.Toolbar;
7 | import android.util.Log;
8 | import android.view.Menu;
9 | import android.view.MenuItem;
10 |
11 | import java.lang.reflect.Field;
12 | import java.lang.reflect.InvocationTargetException;
13 | import java.util.HashMap;
14 | import java.util.Map;
15 |
16 | public class MainActivity extends AppCompatActivity {
17 |
18 | private static final String LOGTAG = "MainActivity";
19 |
20 | @Override
21 | protected void onCreate(Bundle savedInstanceState) {
22 | super.onCreate(savedInstanceState);
23 | setContentView(R.layout.activity_main);
24 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
25 | setSupportActionBar(toolbar);
26 |
27 |
28 | }
29 |
30 | @Override
31 | public boolean onCreateOptionsMenu(Menu menu) {
32 | // Inflate the menu; this adds items to the action bar if it is present.
33 | getMenuInflater().inflate(R.menu.menu_main, menu);
34 | return true;
35 | }
36 |
37 | @Override
38 | public boolean onOptionsItemSelected(MenuItem item) {
39 | // Handle action bar item clicks here. The action bar will
40 | // automatically handle clicks on the Home/Up button, so long
41 | // as you specify a parent activity in AndroidManifest.xml.
42 | int id = item.getItemId();
43 |
44 | switch (id) {
45 | case R.id.use_reflection:
46 | Log.i(LOGTAG, "use reflection current activity=" + getActivity());
47 | break;
48 | case R.id.use_base_activity:
49 | break;
50 | case R.id.use_callback:
51 | break;
52 | }
53 |
54 | return super.onOptionsItemSelected(item);
55 | }
56 |
57 |
58 | public static Activity getActivity() {
59 | Class activityThreadClass = null;
60 | try {
61 | activityThreadClass = Class.forName("android.app.ActivityThread");
62 | Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
63 | Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
64 | activitiesField.setAccessible(true);
65 | Map activities = (Map) activitiesField.get(activityThread);
66 | for (Object activityRecord : activities.values()) {
67 | Class activityRecordClass = activityRecord.getClass();
68 | Field pausedField = activityRecordClass.getDeclaredField("paused");
69 | pausedField.setAccessible(true);
70 | if (!pausedField.getBoolean(activityRecord)) {
71 | Field activityField = activityRecordClass.getDeclaredField("activity");
72 | activityField.setAccessible(true);
73 | Activity activity = (Activity) activityField.get(activityRecord);
74 | return activity;
75 | }
76 | }
77 | } catch (ClassNotFoundException e) {
78 | e.printStackTrace();
79 | } catch (NoSuchMethodException e) {
80 | e.printStackTrace();
81 | } catch (IllegalAccessException e) {
82 | e.printStackTrace();
83 | } catch (InvocationTargetException e) {
84 | e.printStackTrace();
85 | } catch (NoSuchFieldException e) {
86 | e.printStackTrace();
87 | }
88 | return null;
89 | }
90 | }
91 |
--------------------------------------------------------------------------------