Android:App Widget配置活动的行为与Activity不同(编辑自:Android:AppWidget未嵌入主屏幕)

时间:2012-03-30 16:10:16

标签: android widget android-activity

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

我已经将原来的问题缩小到了这一点:对于常规活动和appwidget配置活动,home键的行为不一样。 我用以下最小的活动进行了测试:

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();
  }
}

使用此简单活动创建一个简单的应用程序按预期工作。使用此活动作为App Widget配置活动创建完全没有功能的最简单的窗口小部件,LogCat不会获取我们的logger.info()。

任何线索?

祝你好运

(原帖在这里)

我有一个工作小部件,包括按钮启动活动。其中一个是配置活动,它可以兼作“App Widget配置活动” - 即当用户将小部件嵌入其主屏幕时调用它。

根据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()中,因为使用back或home按钮退出配置活动很愉快,因为没有“save& exit”按钮意味着自动保存。 在onPause()中添加,小部件不会嵌入主屏幕。 LogCat没有显示比信息更严重的内容。

编辑: 缩小到涉及onPause()和硬件主页按钮的问题。硬件后退按钮,让小部件嵌入主屏幕。

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

2 个答案:

答案 0 :(得分:1)

第一个问题是:为什么要让您的应用小部件的工作方式与用户期望的平台中的标准约定不同?将要提供配置UI的应用程序窗口小部件的正常体验是按下或从中取消将取消添加。

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

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

答案 1 :(得分:0)

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

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

每当它被另一个活动隐藏时,这将为您完成活动,并且onPause将在活动生命周期中自然调用。正如我所说,最常见的错误(至少对我来说,我一直这样做)是忘记在你的onPause方法的 end 上调用super.onPause()。