呼叫接收器中未更新布尔值

时间:2017-03-10 10:36:11

标签: java android

我有呼叫接收器,我只想在来电时显示对话框。为此,我创建了一个全局布尔变量,并试图在振铃状态下将其值更改为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;
    }
}

2 个答案:

答案 0 :(得分:0)

您应该使用静态变量(private static num = false)或将您的变量保存在SharedPreferences中(它更好),因为BroadcastReceivers不会在广播之间保存。每个广播都将创建一个BroadcastReceiver的新实例,至少如果通过清单自动注册。

答案 1 :(得分:0)

(您的代码段看起来已损坏,num变量缺少其类型?此答案假定其类型为boolean。)

这听起来像是多线程问题。 java中的线程可以缓存变量的值,因为通过主存储器进行同步更加昂贵。您可以通过将相关字段标记为volatile来强制执行同步。此关键字已解释为here

当一个字段被标记为volatile时,线程可能不会缓存其值,并且对该变量的所有修改都将对所有其他线程可见。

private volatile boolean num = false;