2013-05-20 31 views
0

this教程中,我迅速創建了一個簡單的小工具,顯示和更新當前時間在主屏幕上每秒鐘如何更新小部件只有當WiFi狀態改變?

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

要當某一事件發生時觸發,創建清單文件,一個broastcast receiver(注意不是所有的事件都會被觸發,例如:收到的短信可以,但短信發送不了)。

以下是網絡狀態更改的示例。

1)創建broastcast接收機:

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)本broastcast接收機將從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。正如你看到其他一些更簡單的教程,他們只是把onreceive的主代碼放在broadcast receiver,但是如果你的工作需要很長時間,你應該投入使用,並且應該使用WakefulIntentService,因爲它幫助設備在工作時醒來。

+0

這是一個額外的接收器,我必須定義或我應該替換原來的?我也不確定我如何修改原始的'HelloWidget'代碼。你想介紹一下嗎? – memyself

相關問題