Как я могу получить доступ к Activity из другого класса по всему миру в приложении Android? - PullRequest
0 голосов
/ 13 февраля 2011

У меня есть приложение для Android с двумя действиями, определенными ниже.В MainMenu.oncreate() я запускаю AlarmManager, чтобы периодически запрашивать данные на сервере и обновлять текст кнопки в пользовательском интерфейсе PlayBack.Могу ли я получить доступ к объекту Playback через глобальную ссылку или мне нужно вместо этого AlarmManager в Playback.oncreate(), чтобы я мог передать ссылку на него?Если это так, следует ли это сделать с BroadcastReceiver и Intent, как я делаю с MainMenu, показанным ниже?

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainMenu"
          android:label="@string/app_name">
</activity>
    <activity android:name=".Playing" android:label="@string/playing_title">
         <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>

    <receiver android:name=".NotificationUpdateReceiver" android:process=":remote" />
    <service android:name="org.chirpradio.mobile.PlaybackService"

public class MainMenu extends Activity implements OnClickListener {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_menu);

        View playingButton = findViewById(R.id.playing_button);
        playingButton.setOnClickListener(this);

        try {
            Long firstTime = SystemClock.elapsedRealtime();

            // create an intent that will call NotificationUpdateReceiver
            Intent intent  = new Intent(this, NotificationUpdateReceiver.class);

            // create the event if it does not exist
            PendingIntent sender = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

            // call the receiver every 10 seconds
            AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
            am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 10000, sender);

       } catch (Exception e) {
            Log.e("MainMenu", e.toString());
       }      
    }
}

1 Ответ

1 голос
/ 13 февраля 2011

У меня есть приложение для Android с двумя действиями, определенными ниже.

У вас есть только одно занятие.

В MainMenu.oncreate () у меня запущен AlarmManager, чтобы периодически запрашивать данные на сервере и обновлять текст кнопки в пользовательском интерфейсе PlayBack.

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

Могу ли я получить доступ к объекту «Воспроизведение» через глобальную ссылку или мне нужно вместо этого запустить AlarmManager в Playback.oncreate (), чтобы я мог передать ссылку на него?

Ни.

Использование AlarmManager означает, что вы хотите, чтобы периодическая работа продолжалась даже после того, как пользователь выходит из операции. Следовательно, очень вероятно, что «объект воспроизведения» отсутствует, поскольку пользователь, вероятно, не участвует в вашей деятельности. Ваша служба может отправить собственную трансляцию Intent, которую нужно забрать, если активность Playback все еще существует. Этот пример проекта демонстрирует использование для этого упорядоченной трансляции, поэтому, если активность отсутствует, вместо нее поднимается Notification.

Если, с другой стороны, вы не хотите, чтобы периодическая работа продолжалась, если пользователь выходит из действия, не используйте AlarmManager. Используйте postDelayed() в упражнении, используя Runnable, который запускает ваш сервис с помощью startService(), затем перепланирует себя с помощью postDelayed(). В этом случае вы можете рассмотреть возможность использования чего-то вроде Messenger, чтобы сервис сообщал активности о том, что происходит, если она все еще существует. Этот пример проекта демонстрирует использование Messenger таким образом.

...