我有呼叫接收器,我只想在来电时显示对话框。为此,我创建了一个全局布尔变量,并试图在振铃状态下将其值更改为true。但是当呼叫断开时,代码总是选择布尔值的默认值而不是振铃状态中给出的更新值。变量是num。为什么它总是给出错误的价值,尽管它的价值仅在振铃状态下变为真实。这是代码:
public class phonerece extends BroadcastReceiver{
private Boolean num = false;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
//some task here
}
} else if (extraState != null) {
if (extraState.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
//task
} else if (extraState
.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
if (num) {
phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
//call dialog }
}
} else if (extraState.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
if (checknumber() != null) {
Log.e("Nummber", "found");
} else {
Log.e("Number", "Not Found");
num = true;
}
}
}
}
public String checknumber() {
String res = null;
try {
ContentResolver resolver = context.getContentResolver();
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
Cursor c = resolver.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
if (c != null) { // cursor not null means number is found contactsTable
if (c.moveToFirst()) { // so now find the contact Name
res = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
}
c.close();
}
} catch (Exception ex) {
/* Ignore */
}
return res;
}
}
答案 0 :(得分:0)
您应该使用静态变量(private static num = false)或将您的变量保存在SharedPreferences中(它更好),因为BroadcastReceivers不会在广播之间保存。每个广播都将创建一个BroadcastReceiver的新实例,至少如果通过清单自动注册。
答案 1 :(得分:0)
(您的代码段看起来已损坏,num
变量缺少其类型?此答案假定其类型为boolean
。)
这听起来像是多线程问题。 java中的线程可以缓存变量的值,因为通过主存储器进行同步更加昂贵。您可以通过将相关字段标记为volatile
来强制执行同步。此关键字已解释为here。
当一个字段被标记为volatile
时,线程可能不会缓存其值,并且对该变量的所有修改都将对所有其他线程可见。
private volatile boolean num = false;