Is there a way to get current process name in Android

后端 未结 11 1816
-上瘾入骨i
-上瘾入骨i 2020-12-03 00:59

I set an Android:process=\":XX\" for my particular activity to make it run in a separate process. However when the new activity/process init, it will call my Application:onC

11条回答
  •  青春惊慌失措
    2020-12-03 01:34

    Get it from ActivityThread

    In API 28+, you can call Application.getProcessName(), which is just a public wrapper around ActivityThread.currentProcessName().

    On older platforms, just call ActivityThread.currentProcessName() directly.

    Note that prior to API 18, the method was incorrectly called ActivityThread.currentPackageName() but still in fact returned the process name.

    Example code

    public static String getProcessName() {
        if (Build.VERSION.SDK_INT >= 28)
            return Application.getProcessName();
    
        // Using the same technique as Application.getProcessName() for older devices
        // Using reflection since ActivityThread is an internal API
    
        try {
            @SuppressLint("PrivateApi")
            Class activityThread = Class.forName("android.app.ActivityThread");
    
            // Before API 18, the method was incorrectly named "currentPackageName", but it still returned the process name
            // See https://github.com/aosp-mirror/platform_frameworks_base/commit/b57a50bd16ce25db441da5c1b63d48721bb90687
            String methodName = Build.VERSION.SDK_INT >= 18 ? "currentProcessName" : "currentPackageName";
    
            Method getProcessName = activityThread.getDeclaredMethod(methodName);
            return (String) getProcessName.invoke(null);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }
    

    Compatibility

    Tested and working on

    • Official emulator
      • 16
      • 17
      • 18
      • 19
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • Q beta 1
    • Real devices
      • Motorola Moto G5 Plus running Android 8.1.0
      • Samsung Galaxy S5 running Android 6.0.1
      • Sony Xperia M running stock Android 7.1.1
      • Sony Xperia M running Sony Android 4.1.2

提交回复
热议问题