Android: настройка виджета приложения «Activity» не ведет себя как Activity (отредактировано с: Android: AppWidget не встраивается в домашний экран) - PullRequest
4 голосов
/ 30 марта 2012

(Изменить здесь - Оригинальный пост ниже)

Я сузил исходную проблему до следующего: ключ home просто не ведет себя одинаково для обычной активности и активности конфигурации appwidget.Я сделал тест со следующим минимальным действием:

public class TestActivity extends Activity {    
  Logger logger = Logger.getLogger("logger");   
  @Override
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);
  }
  @Override
  protected void onUserLeaveHint() {
    logger.info("userleave");
    super.onUserLeaveHint();
  }
}

Создание простого приложения с этим простым действием работает как задумано.При создании простейшего виджета без какой-либо функциональности, используя это действие в качестве действия по настройке виджета приложения, LogCat не получает нашего logger.info ().

Есть какие-нибудь подсказки?

BestС уважением

(оригинальный пост здесь)

У меня есть рабочий виджет, состоящий из кнопок запуска действий.Одним из них является действие по настройке, и его можно было бы удвоить как «Активность по настройке виджета приложения» - т.е. вызывать его, когда пользователь встраивает виджет на свой домашний экран.

Следуя руководству разработчика Android,Я добавил этот код в действие настроек:

Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    if (extras != null) {
        int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
        if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
            RemoteViews views = new RemoteViews(this.getPackageName(), R.layout.widgetlayout);
            appWidgetManager.updateAppWidget(appWidgetId, views);
            Intent resultValue = new Intent();
            resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
            setResult(RESULT_OK, resultValue);
            finish();
        }
    }

Добавлено в onCreate (), действие не появляется - вполне логично, так как оно вызывает finish (), а все остальное работает как задумано.

Что я хочу сделать, так это добавить его в onPause (), потому что приятно выйти из операции конфигурации с помощью кнопки «назад» или «домой», поскольку отсутствие кнопки «сохранить и выйти» подразумевает автоматическое сохранение.Добавлено в onPause (), виджет не встраивается в домашний экран .LogCat не показывает ничего более печального, чем информация.

РЕДАКТИРОВАТЬ: Сузили до проблемы, связанной с onPause () и аппаратной кнопкой домой.Аппаратная кнопка «назад» позволяет включить виджет на главный экран.

Если у кого-нибудь есть подсказка, я был бы очень рад, заранее спасибо.

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Первый вопрос: почему вы хотите, чтобы виджет вашего приложения работал иначе, чем стандартное соглашение на платформе, которое ожидает пользователь? Обычный виджет для виджета приложения, который будет предоставлять интерфейс конфигурации, заключается в том, что нажатие кнопки «назад» или «домой» отменит добавление.

Способ, которым это работает, заключается в том, что, когда хост запускает действие конфигурации, он ожидает результата действия, подтверждающего, что виджет должен быть добавлен. Результатом Activity по умолчанию является RESULT_CANCELED, который, по мнению хоста, должен отменить добавление. Итак, чтобы разрешить добавление вашего виджета, вы должны вызвать setResult () с RESULT_OK, прежде чем вызывается ваша finish (), чтобы доставить этот результат обратно на хост.

Обычно плохая идея вызывать метод finish () в onPause (), поскольку onPause () может вызываться по многим причинам. Этот обратный вызов не означает, что пользователь явно покинул вашу деятельность, он просто означает, что она приостановлена.

0 голосов
/ 30 марта 2012

Вызвать финиш из onPause немного странно, я думаю, это может сработать, если вы правильно вызвали super.onPause ().Лучше, тем не менее, для того, чтобы вначале запустить действие, установите для флагов активности значение noHistory следующим образом:

intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);

Это завершает действие для вас каждый раз, когда оно будет скрыто другим действиеми onPause будет вызываться естественным образом в результате жизненного цикла действия.Однако, как я уже сказал, самая распространенная ошибка (по крайней мере, для меня, я делаю это все время) - забывать вызывать super.onPause () в end вашего метода onPause.

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