【问题标题】:Android: App Widget Configuration Activity does not behave like Activity (Edited from: Android: AppWidget not embedding into home screen)Android:App Widget Configuration Activity 的行为不像 Activity(编辑自:Android:AppWidget 未嵌入主屏幕)
【发布时间】:2012-03-30 16:10:16
【问题描述】:

(在此处编辑 - 下面的原始帖子)

我已将最初的问题缩小为: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()。

有什么线索吗?

最好的问候

(此处为原帖)

我有一个由按钮启动活动组成的工作小部件。其中之一是配置活动,它适合兼作“应用程序小部件配置活动” - 即当用户将小部件嵌入其主屏幕时调用它。

按照 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() 和硬件主页按钮的问题。硬件后退按钮,让小部件嵌入到主屏幕中。

如果有人有提示,我会很高兴,提前谢谢你。

【问题讨论】:

标签: android widget android-activity


【解决方案1】:

第一个问题是:为什么您要让您的应用小部件以不同于用户期望的平台标准约定的方式工作?将提供配置 UI 的应用小部件的正常体验是,从那里按返回或主页将取消添加。

它的工作方式是,当主机启动配置活动时,它会等待确认应该添加小部件的活动结果。 Activity 的默认结果是 RESULT_CANCELED,主机认为它应该取消添加。因此,要允许添加您的小部件,您必须在调用 finish() 之前使用 RESULT_OK 调用 setResult(),以便将该结果返回给主机。

通常在onPause() 中调用finish() 是个坏主意,因为可以出于多种原因调用onPause()。该回调并不意味着用户已明确离开您的活动,它只是意味着它正在暂停。

【讨论】:

  • 你好 Hackbod,你的问题的答案已经在我的第一篇文章中,以及我已经使用 RESULT_OK 调用 setResult() 的事实。此外,几乎每个 Android 配置屏幕都没有有一个“保存”按钮,事实上我怀疑任何系统配置都有一个。所以我确实遵循标准约定:通常,当您以任何方式退出配置页面时,您的更改将保存在 onPause() 中。
  • 我不会说预期的行为是使用后退按钮取消 - 当您使用 android 设置时不会发生这种情况,我倾向于遵循“如果我这样做了,我可以撤消它,所以保存它”。
  • 是的,当您编辑内容时,模型已就地编辑。然而,添加一个小部件并不是在编辑某些东西——它是添加某些东西的过程的中间,按下返回会取消添加而不是确认它。
  • 奇怪的是,即使您调用 setResult() 并传递了 RESULT_OK 的值和小部件 ID,HOME 键也不会返回该结果。我发现系统会忽略您设置的结果的意外行为。
  • @RichardLeMesurier 我百分百支持你。我只是浪费了很多时间试图弄清楚为什么我的 appwidget 会在家庭媒体上被删除。
【解决方案2】:

从 onPause 调用完成有点奇怪,我认为它可能会起作用,前提是你适当地调用了 super.onPause()。不过,更好的是,当您首先启动活动时,将活动标志设置为 noHistory,如下所示:

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

每次它会被另一个活动隐藏时,它都会为你完成活动,并且 onPause 将作为活动生命周期的结果自然地被调用。不过,正如我所说,最常见的错误(至少对我来说,我一直这样做)是忘记在 onPause 方法的结束调用 super.onPause()。

【讨论】:

  • 对不起,没有雪茄,但感谢你有一天教我认真看待意图标志!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
相关资源
最近更新 更多