屏幕打开时更新 Android Widget

don*_*nea 5 events android android-widget

这个问题看起来很简单。

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>
Run Code Online (Sandbox Code Playgroud)

在小部件类中,我重写了建议的函数:

@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);
    }
 }
Run Code Online (Sandbox Code Playgroud)

playNotification() 播放闹钟。它在小部件内正常工作。但是当我打开和关闭屏幕时,什么也没有发生。

UPDATE II - Android 中的一个工作小部件

我将小部件的完整代码发布给需要它的人。

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

安卓清单

这是您需要添加到清单中才能在 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>
Run Code Online (Sandbox Code Playgroud)

请注意该代码有效。除了与我的问题有关的所有内容:“屏幕打开时更新 Android Widget”

Mur*_*ain 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>
Run Code Online (Sandbox Code Playgroud)

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.
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

  • &lt;action android:name="android.intent.action.USER_PRESENT" /&gt; 这会起作用。 (3认同)