Не разрешается вызывать мои собственные методы («статическая» тайна) - PullRequest
0 голосов
/ 13 марта 2012

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

Я хочу, чтобы BroadcastClass вызывал метод в моем классе Activity, который заботится о отображаемой строке. Но мой класс BroadcastReceiver не может вызывать методы, которые не являются статическими (?) "Невозможно сделать статическую ссылку на нестатический метод showString (String) из типа myActivity"

И если я сделаю конкретный метод статическим в своем классе Activity, он фактически потеряет связь с пользовательским интерфейсом своей собственной активности, не найдя findViewById больше "Невозможно сделать статическую ссылку на нестатический метод findViewById (int ) из вида Activity ".

В другом небольшом приложении у меня был BroadcastReceiver в качестве внутреннего класса внутри файла класса Activity. Тогда у меня не было проблем с прямым доступом к пользовательскому интерфейсу. Затем у меня были соответствующие представления, объявленные как поля файла класса. Но я бы хотел структурировать вещи лучше, отделяя интерфейс от приема и анализа вещания. Странно, когда весь исходный код приложения находится в одном и том же файле.

Что значит создавать экземпляры Activity? Должен ли я сделать это в самом действии или в BroadcastReceiver? Мне не нужно более одного экземпляра моего пользовательского интерфейса, но мне может потребоваться доступ к нему из нескольких разных классов.

РЕДАКТИРОВАТЬ ДОБАВЛЕНИЕ: Я пробую этот шаблон синглтона из книги, но создание экземпляра myActivity невозможно, доступ к конструктору запрещен. Сбой перед вводом onCreate:

public class MyStartupActivity extends Activity {
    private static MyStartupActivity uniqueInstance;
    private MyStartupActivity() {}
    public static MyStartupActivity instantiate() {
        if (uniqueInstance == null) {
            uniqueInstance = new MyStartupActivity();
        }
        return uniqueInstance;
    }

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Вам нужно добавить поле для объекта Activity в вашем классе BroadcastReceiver, например:

class MyBroadcastReceiver extends BroadcastReceiver {
    private final Activity activity;

    public MyBroadcastReceiver(Activity activity) {
        this.activity = activity;
    }

    public void onReceive(...) {
        View v = activity.findViewById(ID);
        // ...
    }
}

Инициализировать его следующим образом

class MyActivity extends Activity {
    public void onCreate(...) {
        MyBroadcastReceiver receiver = new MyBroadcastReceiver(this);
        // ...
    }
}

РЕДАКТИРОВАТЬ: Если вы неЕсли вы не хотите устанавливать приемник каждый раз, когда создается Activity, вы можете (например) ввести установщик в MyBroadcastReceiver:

class MyBroadcastReceiver extends BroadcastReceiver {
    private Activity activity;

    public void setActivity(Activity activity) {
        this.activity = activity;
    }

    public void onReceive(...) {
        if (activity != null) {
            View v = activity.findViewById(ID);
            // ...
        } else {
            // we don't have an activity, do whatever you can do without it...
        }
        // ...
    }
}

и использовать его в упражнении:

class MyActivity extends Activity {
    private static MyBroadcastReceiver receiver;

    public void onCreate(...) {
        if (receiver == null) {
            receiver = new MyBroadcastReceiver();
            // ...
        }
        receiver.setActivity(this);

        // ...
    }
}
1 голос
/ 13 марта 2012

Вам нужен экземпляр вашего класса для вызова этой нестатической функции в вашу статическую функцию.


Вы не можете поместить Activity как отдельный объект.Андроуд должен иметь доступ к конструктору.Лучше реализовать Application, который является чем-то вроде объекта singelton для вашего приложения.

Вы должны объявить его в своем манифесте следующим образом:

<manifest package="your.personal.package">
...
  <application android:label="@string/app_name"
               android:icon="@drawable/icon"
               android:description="@string/desc"
               android:name=".MySingeltonClass"
               android:debuggable="true">
    ...

Что в вашем приложении вы можете простополучить доступ к этому экземпляру приложения, вызвав getApplicationContext().

Вот более крупный пример:

public class MySingeltonClass extends Application {
    public void doSomething() { ... }
}

В любом из ваших действий вашего приложения вы можете вызывать функцию doSomething() через этот код:

((MySingeltonClass)getApplicationContext()).doSomething();

Обратите внимание, что ваш класс Application, называемый здесь MySingeltonClass, имеет свой собственный контекст, так что вы можете вызывать afik для каждой функции, которая нуждается в контексте.

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