SMS调度程序不接受多个警报

时间:2013-05-02 12:17:40

标签: android android-intent sms android-broadcast

我正在开发一个短信调度程序App。在这里,用户可以设置时间,数字和消息。只要我只需要安排一条消息,我的代码就可以正常工作。但是,如果我想拥有多个时间表,那么新的时间表将取代旧的时间表。

我正在使用的技术是创建一个具有不同请求代码的待处理意图数组,正如我读过的其他一些帖子所建议的那样,但是新的计划取代了旧计划。

以下是我的代码:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_zax_sms_scheduler);

        Button dateSet=(Button) findViewById(R.id.dateSetBtn);
        Button timeSet=(Button) findViewById(R.id.timeSetBtn);

        dateSet.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                DatePickerDialog.OnDateSetListener d=new DatePickerDialog.OnDateSetListener() {

                    @Override
                    public void onDateSet(DatePicker view, int year, int monthodyear, int dayofmonth) {
                        // TODO Auto-generated method stub
                        mMonth=monthodyear;
                        mYear=year;
                        mDay=dayofmonth;
                        Toast.makeText(getBaseContext(), "Date Set is :"+mDay+"/"+(mMonth+1)+"/"+mYear, Toast.LENGTH_SHORT).show();
                    }
                };
                // TODO Auto-generated method stub
                new DatePickerDialog(ZaxSmsScheduler.this,d,Calendar.YEAR,Calendar.MONTH,Calendar.DAY_OF_MONTH).show();
            }
        });

        timeSet.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                TimePickerDialog.OnTimeSetListener t=new TimePickerDialog.OnTimeSetListener() {

                    @Override
                    public void onTimeSet(TimePicker view2, int hour, int min) {
                        // TODO Auto-generated method stub
                        mHour=hour;
                        mMin=min;

                        if(mHour>=12)
                            mHour=mHour-12;

                        Log.d("MYAPP", "hh:"+mHour+"\nmm:"+mMin);
                        Toast.makeText(getBaseContext(), "Time Set is:"+mHour+":"+mMin+":00", Toast.LENGTH_SHORT).show();
                    }
                };
                Calendar cal=Calendar.getInstance();
                new TimePickerDialog(ZaxSmsScheduler.this,t,cal.get(Calendar.HOUR_OF_DAY),cal.get(Calendar.MINUTE),true).show();

            }
        });

        Button saveAndClearBtn=(Button) findViewById(R.id.saveBtn);
        saveAndClearBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Calendar myCal=Calendar.getInstance();
                long timeToTrigger;
                /*myCal.set(Calendar.DAY_OF_MONTH, mDay);
                myCal.set(Calendar.MONTH,mMonth);
                myCal.set(Calendar.YEAR, mYear);*/

                myCal.set(Calendar.HOUR, mHour);
                myCal.set(Calendar.MINUTE, mMin);
                myCal.set(Calendar.SECOND, 0);

                long setTime=myCal.getTimeInMillis();

                if(setTime>System.currentTimeMillis())
                {

                    timeToTrigger=setTime-System.currentTimeMillis();
                    EditText edt1=(EditText) findViewById(R.id.editText1);
                    EditText edt2=(EditText) findViewById(R.id.editText2);
                    msg=edt2.getText().toString();
                    telno=edt1.getText().toString();

                    SQLiteDatabase db=openOrCreateDatabase("MYDB", MODE_PRIVATE, null);
                    db.execSQL("CREATE TABLE IF NOT EXISTS mySmsScheduler(SlNo VARCHAR,Number VARCHAR,Msg VARCHAR);");

                    String s="INSERT INTO mySmsScheduler VALUES ('"+count+"','"+telno+"','"+msg+"');";
                    db.execSQL(s);
                    Log.d("MYREC", "Insertion of data successfull");
                    db.close();

                    edt1.setText("");
                    edt2.setText("");

                     Intent intent = new Intent();
                     intent.setClass(ZaxSmsScheduler.this, MyBroadcastReceiver.class);
                     Bundle b = new Bundle();
                     b.putString("index", Integer.toString(count));
                     intent.putExtras(b);

                     PendingIntent pendingIntent = PendingIntent.getBroadcast(ZaxSmsScheduler.this, (int)Math.random(), intent, 0);
                     intentArray.add(pendingIntent);
                     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                     alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
                            + timeToTrigger, intentArray.get(count));
                     count++;
                    Toast.makeText(getBaseContext(), "Sms Scheduled after:"+(timeToTrigger/1000)+" sec.", Toast.LENGTH_SHORT).show();

                    Log.d("MYAPP", "Set Time:"+(setTime/1000)+"Sec. \n"+"Cur time:"+System.currentTimeMillis()/1000);
                    Log.d("MYAPP", "Time to trigger:"+(timeToTrigger/1000)+"sec.");
                }
                else
                {
                    Toast.makeText(getBaseContext(), "Please Enter a valid time", Toast.LENGTH_SHORT).show();
                    Calendar calendar =Calendar.getInstance();
                    int h=calendar.get(Calendar.HOUR);
                    int m=calendar.get(Calendar.MINUTE);

                    Log.d("MYAPP", "cur HH:"+h+"\ncur MM:"+m);
                }

            }
        });
    }

我的广播接收器的代码是:

@Override
public void onReceive(Context arg0, Intent intent) {
    // TODO Auto-generated method stub

    int myCount;
    String cnt=intent.getStringExtra("index");
    if(cnt==null)
        Log.d("MYAPP","Data not received");
    Log.d("MYAPP", "Count:"+cnt);
    myCount=Integer.parseInt(cnt);

    Log.d("MYAPP","Broadcast receiver called...");
    SQLiteDatabase db=arg0.openOrCreateDatabase("MYDB",Context.MODE_PRIVATE, null);

    Cursor c=db.rawQuery("SELECT Number, Msg FROM mySmsScheduler WHERE SlNo=="+myCount, null);
    Log.d("MYAPP", "Cursor reference obtained...");
    if(c!=null)
    {
        c.moveToFirst();
    }
    else
        Log.d("MYAPP", "cursor is null");
   /* c.moveToFirst();*/
    String num=c.getString(c.getColumnIndex("Number"));
    String myMsg=c.getString(c.getColumnIndex("Msg"));

    Log.d("MYAPP", "number:"+num+"\nMsg:"+myMsg);
    SmsManager sm = SmsManager.getDefault();
    sm.sendTextMessage(num, null, myMsg, null, null);
    Log.d("MYAPP", "Message Sent");
    Toast.makeText(arg0, "Msg sent successfully", Toast.LENGTH_LONG).show();
    String table="mySmsScheduler";
    String whereClause = "SlNo = ?";
    String[] whereArgs = new String[] { Integer.toString(ZaxSmsScheduler.count) };
    db.delete(table, whereClause, whereArgs);
    db.close();
    Log.d("MYAPP", "Entry deleted..");
    //sm.sendTextMessage(ZaxSmsScheduler.telno, null, ZaxSmsScheduler.msg, null, null);

}

我已在我的清单中设置了所需的权限,并已注册我的广播接收器。我恳请您提供宝贵的建议来解决这个问题。

提前致谢。

1 个答案:

答案 0 :(得分:1)

为多个警报使用不同的通知ID

@Override
    public void onReceive(Context c, Intent i) {

        int icon = R.drawable.ic_launcher;
        long when = System.currentTimeMillis();

        Bundle bundle = i.getExtras();
        String title = bundle.getString("title");
        String text = bundle.getString("text");
        String billno = bundle.getString("billno");
        int id = bundle.getInt("id");
        Toast.makeText(c, text, Toast.LENGTH_LONG).show();
        final int NOTIF_ID = id;
        // final int NOTIF_ID = 1;
        NotificationManager notofManager = (NotificationManager) c
                .getSystemService(Context.NOTIFICATION_SERVICE);

        Intent notificationIntent = new Intent(c, AyyappaGoldActivity.class);
        //notificationIntent.putExtra("billno", billno);
        PendingIntent contentIntent = PendingIntent.getActivity(c, 0,
                notificationIntent, 0);

        Notification notification = new Notification(icon, title, when);

        notification.setLatestEventInfo(c, title, text, contentIntent);

        //notification.flags = Notification.FLAG_INSISTENT;
        notification.defaults |= Notification.DEFAULT_SOUND;
        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        notofManager.notify(NOTIF_ID, notification);
    }

}

setAlarm的代码;

int NOTIF_ID = (int) cal.getTimeInMillis();
        NOTIF_ID++;
        Intent intent = new Intent(getApplicationContext(), AlarmActivity.class);
        intent.putExtra("title", title);
        intent.putExtra("text", text);
        intent.putExtra("billno", billno);
        intent.putExtra("id", NOTIF_ID);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                getApplicationContext(), NOTIF_ID, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);

        @SuppressWarnings("static-access")
        AlarmManager alarmManager = (AlarmManager) getApplicationContext()
                .getSystemService(getApplicationContext().ALARM_SERVICE);

        alarmManager.cancel(pendingIntent); // cancel any existing alarms

        alarmManager.set(AlarmManager.RTC_WAKEUP,
                cal.getTimeInMillis(), pendingIntent);