Как получить доступ к сторонним именам активности SDK - PullRequest
0 голосов
/ 24 июня 2019

Мне нужно знать, когда экран становится видимым в приложении, как узнать, какое действие связано с этим экраном. Особенно, если я использую другой SDK для получения экранов входа. Поэтому мне нужно знать название действия и название пакета этих экранов.

В настоящее время в моем классе BaseActivity есть метод для регистрации имен действий при переходе между экранами. Но когда я нажимаю кнопку входа в систему, открывается другой экран, который принадлежит третьей SDK.

   /**
     * Logs the component with activity name and method
     *
     * @param tag
     */
    private void logActivityInfo(String tag) {
        mLogService.logScreenInfo(this.getClass().getSimpleName() + tag);
    }

Я думаю, что это можно решить, если у меня есть хитрость, чтобы получить имя активности, когда я вижу этот экран. Потому что Android Profiler показывает все имена действий при перемещении между всеми экранами. Было бы здорово, если бы кто-нибудь помог мне найти способ решить эту проблему.

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Может быть, отслеживание событий жизненного цикла действий решит вашу проблему, вот пример кода.

    public class MyApplication extends Application
    implements Application.ActivityLifecycleCallbacks {

    private int numStarted;

    ...

    @Override
    public void onCreate() {
        ...
        registerActivityLifecycleCallbacks(this);
    }

    @Override
    public void onActivityStarted(Activity activity) {
        //some code
    }

    @Override
    public void onActivityStopped(Activity activity) {
        //some code
    }
}

, потому что они будут выполняться в контексте вашего приложения, поэтому для отслеживания их там также должен быть указан их список.

1 голос
/ 24 июня 2019

Для этого вы можете использовать сервис accessiblity в Android.У меня есть код, который работает на меня.Вы можете попробовать его

package com.butterfly.instaliker;

public class WindowChangeDetectingService extends AccessibilityService 
{

@Override
protected void onServiceConnected() {
    super.onServiceConnected();

    //Configure these here for compatibility with API 13 and below.
    AccessibilityServiceInfo config = new AccessibilityServiceInfo();
    config.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
    config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;

    if (Build.VERSION.SDK_INT >= 16)
        //Just in case this helps
        config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;

    setServiceInfo(config);
}

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
        if (event.getPackageName() != null && event.getClassName() != null) {
            ComponentName componentName = new ComponentName(
                    event.getPackageName().toString(),
                    event.getClassName().toString()
            );

            ActivityInfo activityInfo = tryGetActivity(componentName);
            boolean isActivity = activityInfo != null;
            if (isActivity)
                if(componentName.flattenToShortString().equalsIgnoreCase(" com.instagram.android/com.instagram.mainactivity.MainActivity")){
                    scrollAndLike(event);
                }
                Log.i("CurrentActivity", componentName.flattenToShortString());
        }
    }
}

private void scrollAndLike(AccessibilityEvent event) {
    AccessibilityNodeInfo nodeInfo = event.getSource();
    Log.i("jude", "ACC::onAccessibilityEvent: nodeInfo=" + nodeInfo);
    if (nodeInfo == null) {
        return;
    }









}

private ActivityInfo tryGetActivity(ComponentName componentName) {
    try {
        return getPackageManager().getActivityInfo(componentName, 0);
    } catch (PackageManager.NameNotFoundException e) {
        return null;
    }
}

@Override
public void onInterrupt() {}
}

Ваше приложение должно иметь разрешение на доступ, которое необходимо включить пользователю, например

if (!isAccessibilitySettingsOn(getApplicationContext())) {
        Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
        startActivityForResult(intent,1000);
    }
    else{
        startService(new Intent(this,WindowChangeDetectingService.class));
    }

и

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 1000){
            startService(new Intent(this,WindowChangeDetectingService.class));
    }
}


private boolean isAccessibilitySettingsOn(Context mContext) {
    String TAG = "jude";
    int accessibilityEnabled = 0;
    final String service = getPackageName() + "/" + WindowChangeDetectingService.class.getCanonicalName();
    try {
        accessibilityEnabled = Settings.Secure.getInt(
                mContext.getApplicationContext().getContentResolver(),
                android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
        Log.v(TAG, "accessibilityEnabled = " + accessibilityEnabled);
    } catch (Settings.SettingNotFoundException e) {
        Log.e(TAG, "Error finding setting, default accessibility to not found: "
                + e.getMessage());
    }
    TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');

    if (accessibilityEnabled == 1) {
        Log.v(TAG, "***ACCESSIBILITY IS ENABLED*** -----------------");
        String settingValue = Settings.Secure.getString(
                mContext.getApplicationContext().getContentResolver(),
                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
        if (settingValue != null) {
            mStringColonSplitter.setString(settingValue);
            while (mStringColonSplitter.hasNext()) {
                String accessibilityService = mStringColonSplitter.next();

                Log.v(TAG, "-------------- > accessibilityService :: " + accessibilityService + " " + service);
                if (accessibilityService.equalsIgnoreCase(service)) {
                    Log.v(TAG, "We've found the correct setting - accessibility is switched on!");
                    return true;
                }
            }
        }
    } else {
        Log.v(TAG, "***ACCESSIBILITY IS DISABLED***");
    }

    return false;
}

Источник:https://stackoverflow.com/a/27642535/5182150

...