Как получить доступ к активности из службы в плагинов Cordova? - PullRequest
0 голосов
/ 07 марта 2019

Я создаю приложение с помощью Cordova, и сейчас я сосредоточен на фоновом сервисе.Мне нужен этот Сервис уведомлений и его регулярное обновление, которое уже работает довольно хорошо.Когда пользователь нажимает на уведомление, оно должно открыть приложение, как, например, в Spotify.Теперь с автономным приложением я обычно просто делаю это так:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
PendingIntent contentIntent = PendingIntent.getActivity(this,0, 
intent, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

NotificationCompat.Builder builder = new NotificationCompat.Builder(context, myChannelID)
.setContentIntent(contentIntent);

И затем создаю уведомление и так далее.Проблема в том, что я не могу получить доступ к Cordova Activity изнутри сервиса.Я пробовал что-то вроде этого:

Intent intent = new Intent(this, MyPlugin.class);

Но так как плагин не расширяет активность (он расширяет CordovaPlugin), это, похоже, не работает.Я могу получить доступ к активности изнутри плагина, но не могу передать активность в службу.Любая помощь будет оценена:).

1 Ответ

0 голосов
/ 07 марта 2019

Вы можете представить свой экземпляр плагина как свойство публичного класса и, следовательно, получить к нему доступ к Cordova Activity:

public class MyPlugin extends CordovaPlugin{
    public static MyPlugin instance = null;
    static CordovaWebView cordovaWebView;
    static CordovaInterface cordovaInterface;

    @Override
    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
        super.initialize(cordova, webView);

        instance = this;
        cordovaWebView = webView;
        cordovaInterface = cordova;
    }

    @Override
    public void onDestroy() {
        instance = null;
    }
}

Тогда ваш сервис может ссылаться на него по этому общедоступному статическому свойству, что-то вроде этого:

public class MyService {
    public static void myMethod(){
        if(MyPlugin.instance != null){
            Activity cordovaActivity = MyPlugin.instance.cordovaInterface.getActivity();
            Context applicationContext = cordovaActivity.getApplicationContext();

            Intent intent = new Intent(applicationContext, cordovaActivity.getClass());
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            PendingIntent contentIntent = PendingIntent.getActivity(applicationContext,0, intent, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            NotificationCompat.Builder builder = new NotificationCompat.Builder(applicationContext, myChannelID).setContentIntent(contentIntent);
        }
    }
}

Обязательно добавьте <param name="onload" value="true" /> к определению <feature> в вашем plugin.xml, чтобы гарантировать, что initialize() вызывается при запуске приложения (см. Инициализация и время жизни плагина ):

<feature name="MyPlugin">
    <param name="android-package" value="cordova.plugin.MyPlugin" />
    <param name="onload" value="true" />
</feature>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...