2017-03-10 8 views
0

着信時のみダイアログを表示したいコール受信側があります。そのために、グローバルブール変数を作成し、呼び出し状態でその値をtrueに変更しようとしました。しかし、コールが切断されたとき、コードは常に呼び出し状態で与えられた更新値ではなく、ブール値のデフォルト値を選択します。変数はnumです。なぜなら、その価値は鳴っている状態でのみ真実になりますが、それはいつも偽りの価値を与えます。 BroadcastReceiversが放送間で保存されていないので、コール受信側でブール値が更新されない

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

あなたは(プライベート静的NUM = false)の静的変数を使用するか、(それが良いでしょう)SharedPreferencesであなたの変数を保存する必要があります。ここでは、コードです。すべてのブロードキャストは、少なくともマニフェスト経由で自動的に登録された場合、BroadcastReceiverの新しいインスタンスを作成します。

+0

あなたのsharedpreferenceアイデアはより実行可能です。 – Panache

0

は(あなたのコードスニペットは、この答えは、その型がbooleanであると仮定し?num変数はその型が欠落している、壊れて見えます。)

これは、マルチスレッドの問題のように聞こえます。メインメモリを介した同期はより高価なので、javaのスレッドは変数の値をキャッシュすることがあります。問題のフィールドにvolatileとフラグを立てることで、同期を強制することができます。このキーワードはhereで説明されています。

フィールドにvolatileというフラグが設定されている場合、スレッドはその値をキャッシュできず、変数に対するすべての変更が他のすべてのスレッドから見えるようになります。

private volatile boolean num = false; 
+0

は、それを揮発させた後でも依然として真ではなく偽の値を取得しています。 – Panache

+0

@Panache、too bad ...:/デバッグ中に、値が変更される(またはアクセスされる)度に、デバッガに変数の値とブレークコードの実行を監視させることができます。そうすれば、いつ、誰が値を変更するのか、それとも最初に変更されたのかを知ることができます。間違ったインスタンスが変更された可能性があります。 – hiergiltdiestfu

+0

私はそのようにしましたが、値は最初に真に変更されましたが、あとでアイドル状態になることはありませんでした。 – Panache

関連する問題