- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这个问题几乎是 Android - Multiple appWidgets playing different sounds 的重复,但我的代码不起作用。我正在添加一个带有小部件 ID 的额外 Intent ,并使用日志语句来证明这一点,但是每当我在有多个实例的情况下单击我的一个小部件时,我只会得到最后一个 appWidgetId。看起来第一个小部件的 Intent 在添加第二个小部件后发生了变化。如果其他帖子中的代码应该有效,那么我一定是忽略了一些东西,因为我相信我的设置方式几乎相同。
public class PhcaAppWidgetProvider extends AppWidgetProvider {
private static final String ACTION_CLICK = "com.skipmorrow.phca.PhcaAppWidgetProvider.WIDGET_CLICKED";
private final String widgetPageName = "_widget";
private static final String PREFS_NAME = "PHCA";
private static final String PREF_PREFIX_KEY = "prefix_";
private static String MY_DEBUG = "PhcaAppWidget";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Log.d(MY_DEBUG, "Provider.onUpdate");
}
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
Log.d(MY_DEBUG, "Provider.onReceive(); action = " + intentAction);
Bundle extras = intent.getExtras();
// make a list of all extras, just so I can see what is in there...
if (extras!=null) {
Set<String> ks = extras.keySet();
Iterator<String> iterator = ks.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
Log.d(MY_DEBUG, "Provider.Key found: " + s);
}
}
else {
Log.d(MY_DEBUG, "Provider.extras was null");
}
int[] appWidgetIds1 = intent.getIntArrayExtra("appWidgetIds");
if (extras!=null && extras.containsKey("appWidgetIds")){
// sometimes the intent comes back with an array of appWidgetIds, and sometimes the appWidgetId is stored
// in the one extra "appWidgetId" Clicks never come with the array of appWidgetIds. They always come by
// themselves
Log.d(MY_DEBUG, "Provider.Intent extras does contain a key appWidgetIds");
if (appWidgetIds1!=null) Log.d(MY_DEBUG, "Provider.Intent int array appWidgetIds1 size is " + appWidgetIds1.length);
for (int i = 0; i<appWidgetIds1.length; i++) {
int appWidgetId = appWidgetIds1[i];
Log.d(MY_DEBUG, "Provider.Intent appWidgetIds1[" + i + "] = " + appWidgetId);
if (intentAction.equals("android.appwidget.action.APPWIDGET_UPDATE")) {
Log.d(MY_DEBUG, "Provider.APPWIDGET UPDATE");
updateWidgetState(context, intentAction, appWidgetId);
} else if (intentAction.equals("android.appwidget.action.APPWIDGET_DELETED")) {
// do nothing
}
else {
super.onReceive(context, intent);
}
}
} else {
String intentData = intent.getDataString();
Log.d(MY_DEBUG, "Provider.intent data = " + intentData);
Integer appWidgetId = intent.getIntExtra("appWidgetId", -1);
Log.d(MY_DEBUG, "Provider.appWidgetId = " + appWidgetId);
if (intentAction.equals(ACTION_CLICK)) {
Log.d(MY_DEBUG, "Provider.Clicked");
SharedPreferences myPrefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_WORLD_WRITEABLE);
Integer objNum = myPrefs.getInt(PREF_PREFIX_KEY + appWidgetId, -1);
Log.d(MY_DEBUG, "Provider.ObjNum = " + objNum);
if (objNum > -1) {
Log.d(MY_DEBUG, "Provider.Executing...");
PageAction pa = (PageAction) CommonActivity.GetPageObjectAtIndex(context, widgetPageName, objNum);
pa.ExecuteActionFromWidgetClick(context);
}
}
else {
super.onReceive(context, intent);
}
}
}
public static void updateWidgetState(Context paramContext, String paramString, Integer appWidgetId)
{
Log.d(MY_DEBUG, "Provider.updateWidgetState; appWidgetId = " + appWidgetId + "; paramString = " + paramString);
RemoteViews localRemoteViews = buildUpdate(paramContext, paramString, appWidgetId);
ComponentName localComponentName = new ComponentName(paramContext, PhcaAppWidgetProvider.class);
AppWidgetManager.getInstance(paramContext).updateAppWidget(localComponentName, localRemoteViews);
}
private static RemoteViews buildUpdate(Context ctx, String paramString, Integer appWidgetId)
{
Log.d(MY_DEBUG, "Provider.buildUpdate(); appWidgetId = " + appWidgetId + "; paramString = " + paramString);
RemoteViews views = new RemoteViews(ctx.getPackageName(), R.layout.phca_appwidget);
if (paramString.equals("android.appwidget.action.APPWIDGET_UPDATE")) {
Log.d(MY_DEBUG, "Provider.buildUpdate().. APPWIDGET_UPDATE");
Intent intent = new Intent(ctx, PhcaAppWidgetProvider.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(ACTION_CLICK);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
Uri data = Uri.withAppendedPath(
Uri.parse("ABCD" + "://widget/id/")
,String.valueOf(appWidgetId));
intent.setData(data);
Log.d(MY_DEBUG, "Provider.Added intent extra \"" + AppWidgetManager.EXTRA_APPWIDGET_ID + "\" = " + appWidgetId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, appWidgetId, intent , PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.phca_appwidget_layout, pendingIntent);
}
if(paramString.equals(ACTION_CLICK))
{
Log.d(MY_DEBUG, "Provider.buildUpdate().. CLICKED");
Toast.makeText(ctx, "ACTION_CLICK", Toast.LENGTH_LONG).show();
}
return views;
}
}
我确实有一个配置 Activity (一个 ListActivity)这是我的 onListItemClick:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Toast.makeText(getApplicationContext(), "onListItemClick", Toast.LENGTH_SHORT);
Log.d(MY_DEBUG, "Configurator.onListItemClick");
SharedPreferences.Editor prefs = getSharedPreferences(PREFS_NAME, 0).edit();
prefs.putInt(PREF_PREFIX_KEY + mAppWidgetId, position);
prefs.commit();
Log.d(MY_DEBUG, "Configurator.Prefs.commit()");
// Push widget update to surface with newly set prefix
Log.d(MY_DEBUG, "Configurator.calling updateWidgetState with appWidgetId = " + mAppWidgetId);
PhcaAppWidgetProvider.updateWidgetState(getApplicationContext(), "android.appwidget.action.APPWIDGET_UPDATE", mAppWidgetId);
Log.d(MY_DEBUG, "Configurator.updateWidgetState complete");
Intent resultValue = new Intent();
Uri data = Uri.withAppendedPath(
Uri.parse("ABCD" + "://widget/id/")
,String.valueOf(mAppWidgetId));
resultValue.setData(data);
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
Log.d(MY_DEBUG, "Configurator.Creating widget with id = " + mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();
}
我已经为此工作了两天,我确实希望有人能指出我的方法的错误。一个虚拟的电子啤酒等待着能解决这个问题的人:)
最佳答案
我试图查看您的代码,但没有找到为什么它对您不起作用,只是我在您的代码中发现了一些其他错误。无论如何,我已经构建了一个可以快速运行的代码,您可以试用。
WidgetProvider.java
package com.example.helloclickablewidget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import android.widget.Toast;
public class WidgetProvider extends AppWidgetProvider {
public static final String WIDGET_CLICKED = "com.example.helloclickablewidget.WIDGET_CLICKED";
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action != null && action.equals(WIDGET_CLICKED)) {
int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
Toast.makeText(context, "Widget clicked. ID: " + widgetId, Toast.LENGTH_LONG).show();
} else {
super.onReceive(context, intent);
}
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(context, WidgetProvider.class);
intent.setAction(WIDGET_CLICKED);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
// Get the layout for the App Widget and attach an on-click listener
// to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
views.setOnClickPendingIntent(R.id.text, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current app widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
layout/widget.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/app_name" >
</TextView>
xml/widget.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/widget"
android:minHeight="50dp"
android:minWidth="50dp"
android:updatePeriodMillis="86400000" >
</appwidget-provider>
AndroidManifest.xml
<manifest package="com.example.helloclickablewidget"
android:versionCode="1"
android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="WidgetProvider" android:exported="false">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="com.example.helloclickablewidget.WIDGET_CLICKED"/>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget" />
</receiver>
</application>
</manifest>
关于Android appWidget 多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10607518/
我正在使用一个服务来更新我的 AppWidgets,该服务监听发布/订阅 channel 并且基本上永远在后台运行,每当收到更新时更新 AppWidgets。 我不担心电池生命周期,因为设备始终处于接
我想获取与应用小部件 ID 关联的应用小部件布局。 在 appwidget 的 Widget provider 类中,android 文档提供了一种获取 appwidget id 的简单方法... p
我在 eclipse 中有 2 个 android 项目,一个是主应用程序,另一个是主屏幕的小部件。我想在用户单击小部件时打开主应用程序。但是,当我使用来自主应用程序的 Activity 创建 Int
我在 Android 市场上发布了几个应用程序小部件,它们大部分都运行良好。但是我注意到使用共享首选项保存的首选项有时会重置为默认值。这种情况下的默认值是硬编码变量。保存在 xml 中的共享首选项与用
假设我有一个 android 项目,它有可以添加到应用程序启动器的可用 appWidget。该项目还有一个显示我创建的 appWidget 的 Activity 。 问题:对于启动器,appWidge
我创建了一个显示数字时钟的简单应用程序小部件,并为该时钟设置了一个 PendingIntent。(即)当用户点击 TextView 时,一个拨号盘被打开。它工作得很好。但是,当我打开一些应用程序(如
我有一个小部件,可以让您从 2 种尺寸中进行选择,它还有一个配置。由于某种原因,一段时间后,我的小部件上的按钮将解除绑定(bind),您将无法单击任何内容。我不知道为什么会这样。难道是我的 OnRec
我遇到的问题是,当我调试我的小部件时,它会更改布局,但当我只是运行它时,它不起作用。根据我的调试消息,它设置了 setOnClickPendingIntent 但它没有启动我的服务。 简而言之,我的小
从主屏幕删除我的最后一个 appWidget 实例后,onDisabled、onEnabled 不工作。 我将我的小部件注册为广播接收器,主屏幕上没有实例但广播接收,而且我看到我的日志写在我的 app
我有一个 appwidget,我想在整个 appwidget 布局上添加一个点击监听器,而不仅仅是在 TextView ecc 上。这是行不通的 remoteViews.setOnClickPendi
我一直致力于实现一个可以手动更新的 AppWidget。但是,出于某种原因,Widget 除了第一次显示时不会更新,并且该更新是通过 Configuration Activity 进行的,它与代码几乎
当我的主要 Activity 暂停时,我需要更新我的 AppWidget。我尝试在主要 Activity 的 onPause() 中使用以下代码: super.onPause(); AppWidget
编辑:我安装了我的应用程序 4.x 设备,没有问题。问题仅存在于 3.x 设备。 我正在尝试在用户设置时手动更新 AppWidget设备上的更改。为此,我使用与此类似的代码: ComponentNam
我正在 android 上创建一些应用程序小部件。我还想重新使用 appwidgets 的布局,这样我就可以在我的 Activity 中进行控制,使其看起来一样。 为了工作正常,我遇到的问题是我希望得
我在编写启动器时遇到了 appwidgets 的问题。只有 Clock widget 正常工作,其他不正常: 部分代码: final AppWidgetHostView hostView = mApp
当我在 Debug模式下运行时,我似乎无法到达服务内部的任何断点,这是为什么? @Override public void onUpdate(Context context, AppWidge
我创建了一个显示简单 TextView 的小部件,它可以在配置 Activity 中作为 Edittext 进行编辑。我使用共享首选项保存输入的文本,因此用户可以点击小部件来编辑文本,并且已经输入的文
我有一个应用程序小部件的问题。它没有配置 Activity 。当我在模拟器中设置 android:updatePeriodMillis="10000" (知道不应该这样做,但它只是为了测试)时 onU
您好,我的 Android 小部件出现了一个非常奇怪的问题,我仔细查看了很多地方,但我似乎无法弄清楚哪里出了问题。基本上我在我的小部件中调用了一个 pendingintent 广播,并在 onreci
这就是我想从我的 AppWidget 中得到的: 配置 Activity 出现,当小部件被添加到屏幕时//到目前为止一切顺利 保存配置后,启动更新小部件的服务//目前为止一切正常 定期安排警报以运行更
我是一名优秀的程序员,十分优秀!