通过单击小部件启动活动

27

我是一个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);
}

1
你现在是如何尝试启动这个活动的?请粘贴你现在所做的代码。 - Kamalone
4个回答

66

在您的小部件 AppWidgetProvider 类的 onUpdate() 方法中使用此代码片段:

@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循环中,现在小部件可以正常点击了! - Nova
它真的会打开两个活动吗?我只在意图中看到一个活动,那么如何同时打开两个活动? - silverFoxA
@silverFoxA 它不会这样做。只打开一个活动。 - hasanghaforian

10
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);

或者你可能需要查看这个链接这个链接


我的错。我的意思是基于另一个小部件而不是创建它。我建议将这段代码放在我的更新函数中?但是我的更新函数已经用于启动服务 - 这会起作用吗?我已经尝试更改更新函数,但它没有起作用。 - Nova
是的,onUpdate方法通常只是启动服务。在Service类内部,您可以将这些代码放在onStart上。 - stuckedoverflow
只需将this替换为context - Wowo Ot

0
为了启动启动器活动,我已将addCategory()setAction()方法集成到onUpdate()方法中。
Intent configIntent = new Intent(context, MainActivity.class);

configIntent.addCategory("android.intent.category.LAUNCHER");
configIntent.setAction("android.intent.action.MAIN");

PendingIntent configPendingIntent = PendingIntent.getActivity(context, Values.REQ_CODE, configIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);

views.setOnClickPendingIntent(R.id.btn_widget, configPendingIntent);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接