【问题标题】:how to update widget only if wifi state changes?仅当 wifi 状态发生变化时如何更新小部件?
【发布时间】:2013-05-20 14:20:38
【问题描述】:

按照this 教程,我快速创建了一个简单的小部件,它每秒在主屏幕上显示和更新当前时间:

问题: 我想知道如何更改此代码,以便仅在发生特定事件时更新时间。例如:仅在 wifi 状态发生变化时更新时间

以下是(希望如此)相关的代码部分:

<!--  Broadcast Receiver -->
<receiver android:name=".WifiSSIDWidget" android:label="@string/app_name">
    <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
    </intent-filter>
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/wifi_ssid_widget_provider" />
</receiver>    

这是小部件类代码:

public class HelloWidget extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 1000);
    }

    private class MyTime extends TimerTask {
        RemoteViews remoteViews;
        AppWidgetManager appWidgetManager;
        ComponentName thisWidget;
        DateFormat format = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM, Locale.getDefault());

    public MyTime(Context context, AppWidgetManager appWidgetManager) {
        this.appWidgetManager = appWidgetManager;
        remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
        thisWidget = new ComponentName(context, HelloWidget.class);
    }

    @Override
    public void run() {
        remoteViews.setTextViewText(R.id.widget_textview, "TIME = " +format.format(new Date()));
        appWidgetManager.updateAppWidget(thisWidget, remoteViews);
    }

    } 
}

【问题讨论】:

    标签: android android-widget android-activity


    【解决方案1】:

    要在某个事件发生时触发,您可以在清单文件中创建一个broastcast receiver(请注意,并非所有事件都会触发,例如:短信接收可以,但短信发送不能)。

    这是网络状态更改的示例。

    1) 创建一个广播接收器:

    public class NetworkStateChangeReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            Log.i(TAG, "Receive Network State Change");
    
                // you put your main code here. 
                // or if you don't want, put your code to service. So, run following code
            Intent myIntent = new Intent(context, NetworkStateChangeService .class);
            // put all intent data to this intent
                    myIntent.putExtras(intent);
                    WakefulIntentService.sendWakefulWork(context, myIntent);
    
        }
    }
    

    2) 这个广播接收器将运行来自NetworkStateChangeService 的代码。这里是NetworkStateChangeService的主要代码:

    public class NetworkStateChangeService extends WakefulIntentService {
    
        public static String TAG = "SMS Service";
    
        public NetworkStateChangeService() {
            super("Network state change");
        }
    
        public SMSReceivedService(String name) {
            super(name);
        } 
    
        @Override
        protected void doWakefulWork(Intent intent) {
                // put your main code here
            }
    }
    

    注意:WakefulIntentServicecommonsguy 发明的自定义类

    3) 您在清单文件中注册您的接收器和服务:

        <receiver android:name="NetworkStateChangeReceiver "> 
                    <intent-filter>
                        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                    </intent-filter>
          </receiver>
    
     <service 
                android:name="NetworkStateChangeService">
     </service>
    

    如果您想使用Broastcast Receiver,上面通常是框架。正如您看到的其他一些更简单的教程,他们只是将主要代码放在broadcast receiveronreceive 中,但是如果您的工作需要很长时间,您应该投入使用,并且应该使用WakefulIntentService,因为它可以帮助设备在执行您的操作时唤醒工作。

    【讨论】:

    • 这是我必须定义的额外接收器还是应该替换原来的接收器?我也不确定如何修改原始HelloWidget 代码。您介意详细说明吗?
    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2022-07-15
    • 2021-07-25
    • 1970-01-01
    • 2020-03-19
    相关资源
    最近更新 更多