【问题标题】:Start activity by clicking on widget通过单击小部件开始活动
【发布时间】:2012-07-19 04:46:31
【问题描述】:

我是 Android 编程的新手,我尝试做一个小部件,它能够从 ISP 获取一些关于我的帐户的数据。有很多未知的事情怎么做,但我做了一些事情——我有一个带有配置活动的小部件,用户应该在其中输入登录名和密码。小部件将数据存储在 SharedPerferences 中,当需要更新小部件时,我使用服务启动 AsyncTask 以从 ISP 获取帐户数据。现在我想通过单击小部件来启动一个活动。我已经尝试了在此站点上找到的所有建议,并且小部件无法启动活动。我的小部件基于放置在这里的另一个小部件https://github.com/Arturus/MetrikaWidget。我不明白我应该通过单击我的小部件来更改什么以及在哪里开始活动。谢谢。

更新: 我的更新功能,我建议我应该放置 PendingIntent

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
    Log.d(TAG, "onUpdate");

    for (int appWidgetId : appWidgetIds)
    {
        updateAppWidget(context, appWidgetManager, appWidgetId);
    }

    /* An updateAppWidget functions looks like as:

    Intent intent = new Intent(context, UpdateWidgetService.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
    context.startService(intent);
    */

    Intent intent = new Intent(context, DetailedStatActivity.class);
    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.layout);

    views.setOnClickPendingIntent(R.id.layout, pendingIntent);

    ComponentName componentName = new ComponentName(context.getPackageName(), WidgetProvider.class.getName());

    appWidgetManager.updateAppWidget(componentName, views);
}

【问题讨论】:

  • 你现在是如何开始活动的?粘贴你现在正在做的代码

标签: android android-activity click widget


【解决方案1】:

在您的小部件AppWidgetProvider 类的onUpdate() 方法中使用这个sn-p:

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
    Intent configIntent = new Intent(context, Activity.class);

    PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, 0);

    remoteViews.setOnClickPendingIntent(R.id.widget, configPendingIntent);
    appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
}     

这里widgetlayout 是小部件布局的名称,R.id.widget 是它的父布局ID。

编辑
现在,我看到了您添加到问题中的代码。您会这样做:

PendingIntent.getActivity(context, 0, configIntent, 0);

(那个开始的活动)而不是

PendingIntent.getService(...);

尝试启动服务。祝你好运。

参考:
doityourselfandroid.com

helloandroid.com

【讨论】:

  • 谢谢,它的工作原理,我把这 5 个环放在 onUpdate 的循环中,然后点击小部件工作!
  • 真的要开两个活动吗?我在意图中只看到一个活动,所以两个活动将如何并行打开
  • @silverFoxA 它不这样做。只打开一个活动。
【解决方案2】:
Intent inet = new Intent(your_action);
inet.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pIntentNetworkInfo = PendingIntent.getActivity(context, 2, 
            inet, Intent.FLAG_ACTIVITY_NEW_TASK);
remoteViews.setOnClickPendingIntent(you_component_when_the_user_pressing_this_activity_should_start, pIntentNetworkInfo);

【讨论】:

    【解决方案3】:

    我不知道“从另一个小部件创建小部件”。这是我不知道的,但我建议您构建自己的小部件。

    除此之外,从小部件调用活动应该使用PendingIntent

    这是一个简单的例子

    Intent iSetting = new Intent(this, MyConfig.class);
    PendingIntent piSetting = PendingIntent.getActivity(this, 0, iSetting, 0);
    views.setOnClickPendingIntent(R.id.IdComponent, piSetting);
    

    或者您可能需要查看this linkthis link

    【讨论】:

    • 我的错。我的意思是基于另一个小部件而不是创建。我建议我应该将此代码放在我的更新函数中?但是我的更新功能已经用于启动服务 - 它会工作吗?我已经尝试过更改更新功能,但它不起作用。
    • 是的 onUpdate 方法通常只是启动服务。在 Service 类本身中,您可以将这些代码放在 onStart 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多