简体   繁体   中英

how to update widget only if wifi state changes?

Following this tutorial I quickly created a simple widget which displays and updates the current time every second on the home screen:

在此处输入图片说明

Question: I was wondering how this code has to be changed, so that the time is only updated when a certain event occurs. Eg: update the time only if wifi state changes .

Here are the (hopefully) relevant code sections:

<!--  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>    

Here's the widget class code:

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);
    }

    } 
}

To trigger when a certain event occurs, you create a broastcast receiver in manifest file (note that not all event will be trigger, for example : SMS received can, but SMS sending cannot).

Here is the example for Network State Change.

1) Create a broastcast receiver:

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) This broastcast receiver will run code from NetworkStateChangeService . Here is the main code of 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
        }
}

Note : WakefulIntentService is a custom class invented by commonsguy

3) You register your receiver and service in manifest file:

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

 <service 
            android:name="NetworkStateChangeService">
 </service>

Above is the framework often if you want to do with Broastcast Receiver . As you see some other easier tutorial, they just put main code in onreceive of broadcast receiver , but if your work takes long time, you should put in service, and should use WakefulIntentService because it helps devices awake while doing your work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM