【问题标题】:How to show an actitivity only when an app widget is first created?如何仅在首次创建应用小部件时显示活动?
【发布时间】:2012-11-12 05:19:25
【问题描述】:

我的应用小部件首次添加到主屏幕时需要进行配置。我想在用户添加小部件后立即打开配置视图。

AppWidgetProvider 没有onCreated 事件,所以我在onUpdate 事件上显示配置活动,并在SharedConfiguration 中存储一个布尔值,表示配置已经显示。有没有更简单的方法?

【问题讨论】:

    标签: android android-activity android-service android-appwidget


    【解决方案1】:

    在 AppWidgetProvider XML 文件中有一个名为 android:configure 的属性

    您可以使用它来指向要在应用拖放到主屏幕时启动的 Activity。例如:

    <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
        android:configure="com.bandsintown.WidgetSettingsActivity"
        android:minWidth="250dp"
        android:minHeight="110dp"
        android:minResizeWidth="180dp"
        android:minResizeHeight="110dp"
        android:resizeMode="vertical|horizontal"
        android:initialLayout="@layout/widget_layout"
        android:updatePeriodMillis="10000" />
    

    在您选择的配置活动中,用户可以做出他们想要的任何选择。您需要获取并存储小部件的 ID。在onCreate方法中,获取id是这样的:

    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    if (extras != null)
        mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
    

    当他们做出选择后,使用它向您的主屏幕小部件发送一条消息,表明它已准备好显示:

    Intent intent = new Intent();
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
    setResult(RESULT_OK, intent);
    
    finish();
    

    这会得到你所追求的。

    【讨论】:

    【解决方案2】:

    尝试将其添加到 onEnabled 函数中。当应用小部件添加到屏幕时会调用 onEnabled

    onEnabled(Context) 当 App Widget 的实例被调用时调用 首次创建。例如,如果用户添加两个 您的 App Widget 的实例,这只是第一次调用。如果 您需要打开一个新数据库或执行其他只需要的设置 为所有 App Widget 实例发生一次,那么这是一个好地方 去做吧。

    举个例子

     @Override
        public void onEnabled(Context context) {
    
        Log.i("INDEX", "WIDGET Enabled");
    
        AppWidgetManager mgr = AppWidgetManager.getInstance(context); 
        RemoteViews defaultViews = new RemoteViews(context.getPackageName(), R.layout.widget_restart); 
        Intent idefault = new Intent(context, MainActivity.class);
        idefault.putExtra("widget", "1");
        PendingIntent defaultpendingIntent = PendingIntent.getActivity(context, 0, idefault, 0);
        defaultViews.setOnClickPendingIntent(R.id.headWidget, defaultpendingIntent);
        ComponentName comp = new ComponentName(context.getPackageName(), Widget.class.getName()); 
        mgr.updateAppWidget(comp, defaultViews); 
        }
    

    第一次创建widget时会调用这个设置widget的外观

    如果您有任何问题,请随时在评论中问我:)

    【讨论】:

    • 据我了解,只有在将小部件的第一个实例添加到主屏幕时才会调用 onEnabled。但是,我允许用户添加多个相同类型的应用小部件,并且每个小部件都需要自己的配置。因此,如果我正确理解文档,onEnabled 只会为第一个小部件调用。
    • 啊对不起,我想我误解了你的问题,现在我没有比使用 sharedpreference 更简单的想法,但我可以问一下,你的第一个小部件有什么区别和其他人?
    • 每个小部件显示不同的数据。更具体地说,每个小部件都会显示公交车站的公交车时间。创建新小部件时,我让用户选择公交车站。
    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多