Можно ли привязать сервис после отмены привязки в Android? - PullRequest
0 голосов
/ 18 сентября 2018

Во-первых, вот мой код.

Class<?> ContextImplClass = Class.forName("android.app.ContextImpl");

// private final LoadedApk mPackageInfo
Field mPackageInfoField = ContextImplClass.getDeclaredField("mPackageInfo");
mPackageInfoField.setAccessible(true);

Object mPackageInfo = mPackageInfoField.get(currentActivity.getBaseContext());

Class loadedApkClass = mPackageInfoField.getType();
Field mServicesField = loadedApkClass.getDeclaredField("mServices");
mServicesField.setAccessible(true);

// Object -> LoadedApk.ServiceDispatcher
ArrayMap<Context, ArrayMap<ServiceConnection, Object>> mServices = null;

if (android.os.Build.VERSION.SDK_INT >= 19) {
  mServices = (ArrayMap<Context, ArrayMap<ServiceConnection, Object>>)
              mServicesField.get(mPackageInfo);
}

if (mServices == null)
  return;

for (Context context : mServices.keySet()) {
  for (ServiceConnection conn : mServices.get(context).keySet()) {
    // Maybe JNIBridge
    if (conn.toString().contains("<native proxy object>")) {
      currentActivity.unbindService(conn);

      // Can't not start
      boolean wasStart = currentActivity.bindService(getIntent(), conn, BIND_AUTO_CREATE);
    }
  }
}

Я не знаю ServiceConnectionImpl.
Я думаю, JNIBridge.
, потому что я могу найти имя, где Proxy.cpp в JNIBridge.

conn.toString()): < native proxy object \>  
conn.getClass().getSimpleName().trim()) -> $Proxy0  

Как я могу решить это?

1 Ответ

0 голосов
/ 18 сентября 2018

В моем приложении мне пришлось привязать сервис, когда он уже работал в фоновом режиме, когда приложение было запущено снова. Я использовал этот код:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(isMyServiceRunning(AudioPlayerService.class)) {
        bindService(new Intent(this, AudioPlayerService.class),
                this, Context.BIND_AUTO_CREATE);
    }
}

private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

    if(manager != null) {
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
    }

    return false;
}

Я проверяю, что служба все еще работает, и привязываю ее к активности. Может быть, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...