如果wifi状态改变,如何更新小部件?

时间:2013-05-20 14:20:39

标签: android android-widget android-activity

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

enter image description here

问题: 我想知道如何更改此代码,以便仅在某个事件发生时更新时间。例如: 仅在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);
    }

    } 
}

1 个答案:

答案 0 :(得分: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
        }
}

注意:WakefulIntentService是由commonsguy

发明的自定义类

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,则上面经常是框架。在您看到其他更简单的教程时,他们只是将主要代码放在onreceive的{​​{1}}中,但如果您的工作需要很长时间,则应该投入使用,并且应该使用broadcast receiver,因为它帮助设备在工作时保持清醒。

相关问题