[英]Update an Android Widget when the screen is turned ON
這個問題看起來很簡單。
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>
在小部件類中,我重寫了建議的功能:
@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>
請注意該代碼有效。 除了我所關心的問題外,其他所有內容:“屏幕打開時更新Android窗口小部件”
您需要為此創建一個廣播接收器。
在您的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.
}
}
}
這個問題變成一個新問題,因此我想舉一些例子。 您現在的問題是,如何從所有其他類中更新窗口小部件。 我懷疑您的playNotification(); 方法在您的小部件的接收器內部。 您需要做的是,使用您的playNotification()方法將一個額外的類設置為public,以便您可以從其他每個類中調用它。 根據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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.