- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
每当网络数据包数据连接发生变化时,我想更新小部件文本及其颜色。即使这个小部件也可以启用/禁用网络数据包数据。android.net.conn.CONNECTIVITY_CHANGE 的广播接收器已在 Android list 文件中注册并且 onReceive() 已在 AppWidgetProvider 类中被覆盖。
每当我启用/禁用连接 onReceive() 被触发两次时,我注意到一个非常奇怪的行为。在第一个实例中,我收到 NetworkInfo
对象,但在第二个实例中,我没有收到信息实例。 但是当我通过系统设置启用/禁用连接时 onReceive() 被触发一次并且 NetworkInfo
对象为空。
这是我的 list 文件。
<?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>
我的 AppWidgetProvider 类如下。
public class ExampleAppWidgetProvider extends AppWidgetProvider {
int[] mAppWidgetIds;
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
this.mAppWidgetIds = appWidgetIds;
// Get all ids
ComponentName thisWidget = new ComponentName(context,
ExampleAppWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
// Build the intent to call the service
Intent intent = new Intent(context.getApplicationContext(),
UpdateWidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
// Update the widgets via the service
context.startService(intent);
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
StringBuilder str = new StringBuilder();
if (info != null) {
str.append(" info is NULL");
}
if (checkConnectivityState(context)) {
str.append("; data is enable");
} else {
str.append("; data is disable");
}
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
}
public static void updateAppWidget(Context context,
int[] appWidgetIds, boolean enable) {
if (appWidgetIds == null) {
return;
}
if (appWidgetIds.length > 0) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget1);
if (enable) {
updateViews.setTextColor(R.id.BtEnableDisable, Color.GREEN);
updateViews.setTextViewText(R.id.BtEnableDisable, "Enabled");
} else {
updateViews.setTextColor(R.id.BtEnableDisable, Color.GRAY);
updateViews.setTextViewText(R.id.BtEnableDisable, "Disabled");
}
appWidgetManager.updateAppWidget(appWidgetIds, updateViews);
Toast.makeText(context, "updateAppWidget() ", Toast.LENGTH_SHORT).show();
}
}
private boolean checkConnectivityState(Context context) {
final TelephonyManager telephonyManager = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
return telephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED;
}
}
启用/禁用网络数据包数据连接的服务类。
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;
}
}
我还尝试使用 Broadcast Receiver 类,只要连接发生变化,我就会收到 NetworkInfo。但我不知道如何从广播接收器更新小部件文本/颜色。
一旦我收到 CONNECTIVITY_CHANGE Intent ,是否有任何其他方法可以更新小部件文本/颜色?
我不明白为什么我在 AppWidgetProvider
中得到两个 CONNECTIVITY_CHANGE Intent ,但我必须学习如何从广播接收器更新小部件,下面是代码。
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);
}
}
}
如果有人知道我为什么会收到两个 CONNECTIVITY_CHANGE Intent ,请在这里分享您的想法。在这里我们将不胜感激。
最佳答案
现在我发现了为什么在单击按钮以启用/禁用网络时 onReceive()
被调用两次。1. 第一次在 APPWIDGET_UPDATE
intent 广播时被调用。2. 第二次在 CONNECTIVITY_CHANGE
Intent 广播时被调用。
无论如何,我可以从广播接收器更新小部件,源代码已在上面的帖子中发布。
关于android - 如何在收到广播 Intent CONNECTIVITY_CHANGE 后更新小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11181732/
如果我想为收藏创建一个 Intent 。 如果用户问“他最喜欢什么”,它会显示一些建议芯片 因此它会调用与该芯片相关的任何后续 Intent 。 最喜欢的饮料 最喜欢的食物 最喜欢的电影等 我还想直接
我确信有一些显而易见的事情,但还没有找到解决这个简单问题的方法。错误是在用户猜出正确答案时尝试启动另一个 Activity 的主要 Activity : Error:(85, 23) Unresolv
public class MainActivity extends Activity { Button b; //FrameLayout fl; @Override p
我对 intentService 有点困惑。文档说,如果您向 intentService 发送多个任务( Intent ),那么它将在一个单独的线程上一个接一个地执行它们。我的问题是 - 是否可以同时
我正在尝试从其他应用程序获取 mime 类型 text/plain 的 Intent 并将该文本存储在字符串类型的变量中。它在 onCreate 方法中工作正常,但是当我使用 singleTask 作
我想知道,2个代码有什么区别? newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
如何设置我的 Activity 以响应任何类型的共享 Intent 。 我试过:- 但是这不起作用,我已经阅读了http://developer.android.co
鉴于子类具有不同的上下文以及在单击监听器后启动的不同 Activity ,父类(super class)中的代码 Intent Intent=new Intent(context,Activity.c
更新#1:更多信息添加到这篇文章的末尾 我是 Android 开发和测试的新手。 我有 3 个 Espresso 测试。第一个测试通过,但第二个不会运行,因为在第二个测试之前调用 setUp() 方法
我是 Espresso UI 测试的新手。 我在运行测试时遇到这个错误(ADT Eclipse IDE)。 该应用程序已经开发完成,并且在启动该应用程序时有很多请求正在进行。无法重写应用程序。但我需要
因此,尝试创建一个我认为是基本简历应用程序的应用程序。我有两个类(class),都有同样的问题。它说它“无法解析符号 Intent ” 谷歌部分做了,但没有任何意义.. 这是我的代码。 MainAct
我正在尝试将 user_id 值从一个 Intent 传递到另一个 Intent。我知道这是一个非常简单的过程,而且我已经这样做了好几次了。但对于下面的代码,我有点困惑。 我需要将 user_id 值
这是我将值传递给名为 choice 的类的主要 Activity 。 @Override public void onClick(View v) { // TODO Auto-generated me
我正在寻找一个 Android Intent 来翻译文本,我发现了这个: Google Translate Activity not working anymore 但我想在任务管理器中使用它。我真的
可以设置多个启动 Intent ,例如,当用户点击通知时。 让我解释一下我的具体问题: 我有一个带通知的应用程序。每个通知都会打开一个不同的 Activity (也有不同的附加功能)。 现在我想提取有
我有一个 Intent launchIntent = packageManagerForListener.getLaunchIntentForPackage(packagesForAdapter[po
List targetedShareIntents = new ArrayList(); Intent shareIntent = new Intent(android.content.Intent.
所以我试图在选择列表中的项目后启动一个新 Activity ......根据我所读的内容非常基本。我也在尝试在附加功能中发送一个值。所以我可以选择列表中的项目,然后新 Activity 开始,extr
有没有一种方法可以将一个Intent bundle 从一个 Intent 传递到另一个 Intent ,而不必提取包并单独处理每个额外的 Intent ? 例子: intent2.setExtras(
这个问题在这里已经有了答案: Android 5.0 (L) Service Intent must be explicit in Google analytics (11 个答案) 关闭 6 个月
我是一名优秀的程序员,十分优秀!