这个问题很简单。
Android Widget充当魅力,一切都还可以。
我只想在(在适当的时候) 用户打开其设备屏幕 时更新小部件内容 。
我无法在互联网或文档中找到这方面的提示。这意味着我清楚地忽略了一些简单而重要的事情。
感谢Murtaza的回答,看起来很完美,但出于某些原因,它还没有成功。 我的小部件已经有一个接收器,所以我添加了建议的意图过滤器:
<receiver android:name=".MyWidget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.intent.action.SCREEN_ON" />
<action android:name="android.intent.action.SCREEN_OFF" />
</intent-filter>
在widget类中,我重写了建议的函数:
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
playNotification(context);
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
playNotification(context);
}
}
playNotification()播放闹钟。它在小部件内正常工作。但当我打开和关闭屏幕时,没有任何反应。
我发布了需要它的小部件的整个代码。
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.widget.RemoteViews;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.Calendar;
/**
* Implementation of App Widget functionality.
*/
public class MyWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
updateAppWidget(context, appWidgetManager, appWidgetIds[i]);
}
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
playNotification(context, true);
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
playNotification(context, true);
}
}
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
String widgetText = "";
playNotification(context, true);
widgetText += " DATE:" + Calendar.getInstance().getTime().getHours() + ":" + Calendar.getInstance().getTime().getMinutes();
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.mywidget);
views.setTextViewText(R.id.appwidget_text, widgetText);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
public static void playNotification(Context context, boolean alarm) {
try {
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
if (alarm) notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
Ringtone r = RingtoneManager.getRingtone(context, notification);
if (!r.isPlaying())
r.play();
} catch (Exception e) {
e.printStackTrace();
}
}
这是您需要添加到清单以在Android上拥有工作窗口小部件的内容。更多,我想做的过滤器。
<receiver android:name=".MYWidget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.intent.action.SCREEN_ON" />
<action android:name="android.intent.action.SCREEN_OFF" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/mywidget_info" />
</receiver>
请注意代码有效。除了我的问题之外的一切:&#34;当屏幕打开时更新Android Widget&#34;
答案 0 :(得分:1)
您需要为此创建一个广播接收器。
在Manifest.xml中添加这些权限
<receiver android:name=".MyBroadcastReceiver" android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.ACTION_SCREEN_ON"></action>
<action android:name="android.intent.action.ACTION_SCREEN_OFF"></action>
</intent-filter>
</receiver>
MyBroadcastReceiver.java
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
//update your widget.
}
}
}
答案 1 :(得分:0)
这个问题变成了一个新问题,所以我想展示一些例子。您现在的问题是,如何从所有其他类中更新窗口小部件。我怀疑,你的playNotification();方法在您的小部件的接收器内。你需要做的是,使用你的playNotification()方法作为公共场所制作一个额外的课程,这样你就可以从其他所有课程中调用它。根据Murtaza和您的更新的答案来看这个例子:
public class NotificationHelper{
private Context mContext;
//make a constructor and set Context or other objects/values if You need it
public NotificationHelper(Context ctx){
mContext = ctx;
}
public void playNotification(){
//do Your stuff here inside
}
}
通过这个公共课,你可以从其他地方做你的东西。例如,在屏幕打开或关闭时将触发的AppWidget Receiver或BroadCastReceiver内部:
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
NotificationHelper mHelper = new NotificationHelper(context);
mHelper.playNotification();
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
NotificationHelper mHelper = new NotificationHelper(context);
mHelper.playNotification();
}
}