Android 接收到广播意图连接更改后如何更新小部件
我想在网络数据包连接发生变化时更新小部件文本及其颜色。甚至这个小部件也可以启用/禁用网络数据包数据。 android.net.conn.CONNECTIVITY的广播接收器\u更改已在android清单文件中注册,并且onReceive()已在AppWidgetProvider类中重写 每当我启用/禁用连接onReceive()时,我注意到一个非常奇怪的行为被触发了两次。在第一个实例中,我接收到Android 接收到广播意图连接更改后如何更新小部件,android,android-intent,android-widget,intentfilter,Android,Android Intent,Android Widget,Intentfilter,我想在网络数据包连接发生变化时更新小部件文本及其颜色。甚至这个小部件也可以启用/禁用网络数据包数据。 android.net.conn.CONNECTIVITY的广播接收器\u更改已在android清单文件中注册,并且onReceive()已在AppWidgetProvider类中重写 每当我启用/禁用连接onReceive()时,我注意到一个非常奇怪的行为被触发了两次。在第一个实例中,我接收到NetworkInfo对象,但在第二个实例中,我没有接收到info实例。 但当我通过系统设置启用/禁用
NetworkInfo
对象,但在第二个实例中,我没有接收到info实例。
但当我通过系统设置启用/禁用连接时,onReceive()将被触发一次,并且NetworkInfo
对象为空
这是我的清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rakesh.simplewidget"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<!-- Permissions -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<!-- Widget Broadcast receiver -->
<receiver
android:name=".ExampleAppWidgetProvider"
android:label="Widget ErrorBuster" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget1_info" />
</receiver>
<service android:name=".UpdateWidgetService"></service>
</application>
</manifest>
启用/禁用网络数据包连接的服务类
public class UpdateWidgetService extends Service {
private static final String LOG = "de.vogella.android.widget.example";
@Override
public void onStart(Intent intent, int startId) {
Log.i(LOG, "Called");
// Create some random data
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this
.getApplicationContext());
int[] allWidgetIds = intent
.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
ComponentName thisWidget = new ComponentName(getApplicationContext(),
ExampleAppWidgetProvider.class);
int[] allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget);
Log.w(LOG, "From Intent" + String.valueOf(allWidgetIds.length));
Log.w(LOG, "Direct" + String.valueOf(allWidgetIds2.length));
for (int widgetId : allWidgetIds) {
// Create some random data
int number = (new Random().nextInt(100));
RemoteViews remoteViews = new RemoteViews(this
.getApplicationContext().getPackageName(),
R.layout.widget1);
Log.w("WidgetExample", String.valueOf(number));
EnableDisableConnectivity edConn = new EnableDisableConnectivity(this.getApplicationContext());
edConn.enableDisableDataPacketConnection(!checkConnectivityState(this.getApplicationContext()));
// Register an onClickListener
Intent clickIntent = new Intent(this.getApplicationContext(),
ExampleAppWidgetProvider.class);
clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,
allWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, clickIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.BtEnableDisable, pendingIntent);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
stopSelf();
super.onStart(intent, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private boolean checkConnectivityState(Context context){
final TelephonyManager telephonyManager = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
return telephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED;
}
}
我还尝试使用广播接收器类,每当连接发生变化时,我都会收到NetworkInfo。但我不知道如何从广播接收器更新小部件文本/颜色
收到连接\更改意图后,是否有其他方法可以更新小部件文本/颜色
编辑:
我无法理解为什么我在AppWidgetProvider
中获得了两个连接更改意图,但我学会了如何从广播接收器更新小部件,下面是代码
public class ConnectivityReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
NetworkInfo info = (NetworkInfo)intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
if(info.getType() == ConnectivityManager.TYPE_MOBILE){
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget1);
if(info.isConnectedOrConnecting()){
Toast.makeText(context, "Data packet enabled", Toast.LENGTH_SHORT).show();
Log.d("RK","Mobile data is enabled");
remoteViews.setTextColor(R.id.BtEnableDisable, Color.GREEN);
remoteViews.setTextViewText(R.id.BtEnableDisable, "Enabled");
}else{
Toast.makeText(context, "Data packet disabled", Toast.LENGTH_SHORT).show();
Log.e("RK","Mobile data is disconnected");
remoteViews.setTextColor(R.id.BtEnableDisable, Color.BLACK);
remoteViews.setTextViewText(R.id.BtEnableDisable,"Disabled");
}
ComponentName thiswidget = new ComponentName(context, ExampleAppWidgetProvider.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(thiswidget, remoteViews);
}
}
}
如果有人知道为什么我有两个改变的意图,请在这里分享你的想法。非常感谢您的帮助。现在我发现了为什么当单击按钮启用/禁用网络时,
onReceive()
会被调用两次。
1.当APPWIDGET\u UPDATE
intent广播时,它第一次被调用。
2.当连接更改意图广播时,第二次调用它
无论如何,我能够从广播接收器更新小部件,源代码已经发布在上面的帖子中
public class ConnectivityReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
NetworkInfo info = (NetworkInfo)intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
if(info.getType() == ConnectivityManager.TYPE_MOBILE){
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget1);
if(info.isConnectedOrConnecting()){
Toast.makeText(context, "Data packet enabled", Toast.LENGTH_SHORT).show();
Log.d("RK","Mobile data is enabled");
remoteViews.setTextColor(R.id.BtEnableDisable, Color.GREEN);
remoteViews.setTextViewText(R.id.BtEnableDisable, "Enabled");
}else{
Toast.makeText(context, "Data packet disabled", Toast.LENGTH_SHORT).show();
Log.e("RK","Mobile data is disconnected");
remoteViews.setTextColor(R.id.BtEnableDisable, Color.BLACK);
remoteViews.setTextViewText(R.id.BtEnableDisable,"Disabled");
}
ComponentName thiswidget = new ComponentName(context, ExampleAppWidgetProvider.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(thiswidget, remoteViews);
}
}
}