3

我想獲得的編號broadcastriver如何在android中獲得broadcastreceiver的ID

有什麼辦法可以找到idbroadcastreciver ??我正在製作一個報警應用程序並保存報警,我發送broadcast使用pending intent。現在,如果用戶編輯鬧鐘,我想中止特定的broadcast併發送新時間的新broadcast

我該怎麼做?

我使用這個代碼廣播

Intent intent = new Intent(this, StartProfileBroadcastReceiver.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(
       this.getApplicationContext(), 234324243, intent, 0); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, StartTimemill, pendingIntent); 

,並在明顯的,我註冊使用我Broadcastreciver這段代碼

<receiver android:name="StartProfileBroadcastReceiver" > 
</receiver> 

回答

1

您可以:

  1. 保持對它的引用您註冊的PendingIntent對象與AlarmManager,並致電PendingIntent.cancel可以當你註冊一個新的警報時,請注意。
  2. 創建PendingIntent時使用標記FLAG_CANCEL_CURRENT

使用這兩種方法,我github通過這個項目,你可以等創建新的..

+0

你可以聯繫我更多細節plzzz –

+0

你需要哪些細節? – Jong

+0

如何保持PendingIntent的參考? –

4

,你可以找到項目時大量的報警,並能趕上cancaled報警舊警報將被刪除。

報警類是需要保持獲得具體的數據

Alarm.java

public class Alarm { 
    public int getState() { 
     return state; 
    } 

    public void setState(int state) { 
     this.state = state; 
    } 

    public int getUniqueID() { 
     return uniqueID; 
    } 

    public void setUniqueID(int uniqueID) { 
     this.uniqueID = uniqueID; 
    } 

    private int state; 
    private int uniqueID; 

} 

AlarmHolder是獨立的,並在一個ArrayList持有報警

AlarmHolder.java

import java.util.ArrayList; 

public class AlarmHolder{ 
     private static AlarmHolder uniqueAlarmHolder; 
     private ArrayList<Alarm> lAlarms; 

     private AlarmHolder() {   
      lAlarms = new ArrayList<Alarm>(); 
     } 

     public synchronized static AlarmHolder getInstance()  
     { 
      if (uniqueAlarmHolder == null) { 
       uniqueAlarmHolder = new AlarmHolder(); 
      } 
      return uniqueAlarmHolder; 
     } 

     public void registerAlarm(int id) { 
      Alarm a = new Alarm(); 
      a.setState(1); 
      a.setUniqueID(id); 

      lAlarms.add(a); 
     } 

     public void removeAlarm(int id,Alarm a) { 
      Alarm newAlarm = new Alarm(); 
      a.setState(0); 
      a.setUniqueID(id); 

      lAlarms.remove(id); 
      lAlarms.add(newAlarm);   
     } 

     public void replaceList(ArrayList<Alarm> newList) { 
      lAlarms.clear(); 
      lAlarms.addAll(newList);  
     } 

     public ArrayList<Alarm> getAlarms() { 
      return lAlarms; 
     } 

     public Alarm lastAlarmId() { 
      return lAlarms.get(lAlarms.size()-1); 
     } 
    } 

MyBroadcastReceiver.java

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Vibrator; 
import android.util.Log; 
import android.widget.Toast; 

public class MyBroadcastReceiver extends BroadcastReceiver { 
    AlarmHolder objAlarmHolder = AlarmHolder.getInstance(); 

    @Override 
    public void onReceive(Context context, Intent intent) { 

      // with this key we can catch the alarm which we want 
     int key = intent.getIntExtra("key",0); 


     for (Alarm alarm : objAlarmHolder.getAlarms()) { 
      // if alarmstate is 1 and the key belogs that alarm device will vibrate 
      if (alarm.getState() == 1 & alarm.getUniqueID() == key) { 
       Log.v("alarm", String.valueOf(String.valueOf(alarm.getUniqueID()))); 
       Toast.makeText(context, "your alarm id : " + String.valueOf(alarm.getUniqueID()),Toast.LENGTH_LONG).show(); 
       Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); 
       vibrator.vibrate(2000); 
      } else { 
       Log.v("alarm", "canceled alarm number : " + String.valueOf(alarm.getUniqueID())); 
      } 

     } 

    } 

} 

MainActivity.java

import java.util.ArrayList; 
import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
    EditText text; 
    int uniqueInteger = 1; 
    AlarmHolder objAlarmHolder = AlarmHolder.getInstance(); 
    ArrayList<Alarm> tempAlarmHolder = new ArrayList<Alarm>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     text = (EditText) findViewById(R.id.editText1); 

     Button btn = (Button) findViewById(R.id.button1); 

     btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
          // we should pass unique integer to method 
       startAlert(uniqueInteger); 
       uniqueInteger++; 
      } 
     }); 
    } 

    public void startAlert(int rnd) { 
     int i = Integer.parseInt(text.getText().toString()); 
     Bundle bundle = new Bundle(); 
     bundle.putInt("key", uniqueInteger); 

     objAlarmHolder.registerAlarm(uniqueInteger); 

     int alarmCount = 0; 
     tempAlarmHolder.clear(); 


      // in this loop, all old alarms' state will set as 0 
     for (Alarm alarm : objAlarmHolder.getAlarms()) { 

      if(alarmCount < objAlarmHolder.getAlarms().size()-1) 
      { 
       Alarm objAlarm = new Alarm(); 
       objAlarm.setState(0); 
       objAlarm.setUniqueID(alarmCount);    
       tempAlarmHolder.add(objAlarm);    
      } 
      else 
      { 
       tempAlarmHolder.add(alarm);    
      }   
      alarmCount++; 
     } 

     objAlarmHolder.replaceList(tempAlarmHolder); 




     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() 
       + (i * 1000), getPendingIntent(bundle, uniqueInteger)); 
     Toast.makeText(this, "Alarm set in " + i + " seconds", 
       Toast.LENGTH_LONG).show(); 
    } 

    private PendingIntent getPendingIntent(Bundle bundle, int rc) { 
     Intent intent = new Intent(MainActivity.this, MyBroadcastReceiver.class); 

      // send alarm id to broatcast 
     intent.putExtras(bundle); 
     return PendingIntent.getBroadcast(this, rc, intent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
    } 
} 

的Manifest.xml

<uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 
    <uses-permission android:name="android.permission.VIBRATE" ></uses-permission> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <receiver android:name="MyBroadcastReceiver" > 
     </receiver> 
    </application> 

activity_main。xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <EditText 
     android:id="@+id/editText1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="65dp" 
     android:ems="10" /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/editText1" 
     android:layout_centerHorizontal="true" 
     android:text="Button" /> 

</RelativeLayout> 
+0

以下添加了我的答案,但是考慮到大多數使用鬧鐘管理器的應用程序都不會運行,所以將unique_id保存在數據庫中會更好。 –