2010-10-06 89 views
0

例如,我保存時間6:00和6:05然後當我開始我的服務時,第一條消息在6:00將發送,第二條不是。這裏Timer類不能正常工作我不知道爲什麼?請幫助me.Manifest文件是正確的短信調度程序在特定時間用於短信

這裏是我的代碼

package com.sms; 

import java.util.Calendar; 
import java.util.Date; 
import java.util.Locale; 
import org.apache.http.impl.cookie.DateUtils; 
import android.R.string; 
import android.app.Activity; 
import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.app.PendingIntent; 
import android.app.PendingIntent.OnFinished; 
import android.app.TimePickerDialog; 
import android.content.BroadcastReceiver; 
import android.content.ContentResolver; 
import android.content.ContentUris; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.CountDownTimer; 
import android.provider.Contacts; 
import android.provider.Contacts.People; 
import android.provider.ContactsContract; 
import android.provider.ContactsContract.CommonDataKinds.Phone; 
import android.telephony.SmsManager; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.Button; 
import android.widget.DatePicker; 
import android.widget.EditText; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.TimePicker; 
import android.widget.Toast; 

public class sendtomany extends Activity implements OnClickListener, OnItemSelectedListener { 
/** Called when the activity is first created. */ 

EditText settimetomany, setdatetomany,selectno; 
Intent i; 
TextView timedisplay; 
String pername; 
TextView timetomany, datetomany; 
static final int DATE_DIALOG_ID = 0; 
static final int time_dialog_id=1; 
Spinner spintomany; 
SimpleCursorAdapter simplecursor; 
String messagebody; 
Button oksendtomany; 
String timehour; 
String timemin; 
long datediff; 

int syear, smonth, sdays; 
int shour, smin, psec; 
int chour, cmin, csec; 
int cyear, cmonth,cdays; 
long gettime, getdate; 
String smstable; 
SQLiteDatabase db=null; 




private PendingIntent sentPI; 
// MyCount counter; 

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

    selectno=(EditText) findViewById(R.id.selectno); 
    settimetomany=(EditText) findViewById(R.id.settimetomany); 
    settimetomany.setOnClickListener(this); 
    setdatetomany=(EditText) findViewById(R.id.setdatetomany); 
    spintomany=(Spinner) findViewById(R.id.spintomany); 
    setdatetomany.setOnClickListener(this); 
    oksendtomany=(Button) findViewById(R.id.oksendtomany); 
    oksendtomany.setOnClickListener(this); 
    //timetomany=(TextView) findViewById(R.id.timetomany); 
    // datetomany=(TextView) findViewById(R.id.datetomany); 
    timedisplay=(TextView) findViewById(R.id.timedisplay); 
    Bundle extras=getIntent().getExtras(); 
    if(extras!=null) 
    { 
    messagebody=extras.getString("mesbody"); 
    } 

    Cursor cur = getContentResolver().query(
     People.CONTENT_URI, null, null, null, null); 

     startManagingCursor(cur); 

     String[] columns = new String[] { People.NAME ,People.NUMBER}; 

     int[] names = new int[] {android.R.id.text1}; 

    simplecursor=new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, cur, columns,names); 

    simplecursor.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    spintomany.setAdapter(simplecursor); 
    spintomany.setOnItemSelectedListener(this); 

    db=openOrCreateDatabase("sms.db", SQLiteDatabase.CREATE_IF_NECESSARY, null); 
    db.setVersion(1); 
    db.setLocale(Locale.getDefault()); 
    db.setLockingEnabled(true); 
    smstable="Create table IF NOT EXISTS smstable" + 
    " (settime long," + 
    " message Text," + 
    " phonenumber text)"; 

    db.execSQL(smstable);  

    // smsservice.setMainActivity(this); 




    } 


    public void onClick(View v) { 
// TODO Auto-generated method stub 

switch(v.getId()) 
{ 

    case R.id.setdatetomany: 
    //i=new Intent(this , datepicker.class); 
//startActivity(i); 
showDialog(DATE_DIALOG_ID); 

    break; 

case R.id.settimetomany: 

showDialog(time_dialog_id); 
break; 


case R.id.oksendtomany: 


Calendar c = Calendar.getInstance(); 
cyear = c.get(Calendar.YEAR); 
cmonth = c.get(Calendar.MONTH); 
cmonth=cmonth+1; 
cdays = c.get(Calendar.DAY_OF_MONTH); 
chour=c.get(Calendar.HOUR_OF_DAY); 
     cmin=c.get(Calendar.MINUTE); 
     csec=c.get(Calendar.SECOND); 
    int ssec=00; 

    datediff=(new Date(syear,smonth,sdays,shour,smin,ssec)).getTime();//-(new Date(cyear,cmonth,cdays,chour,cmin,csec)).getTime(); 
    //timedisplay.setText(" " + datediff + " "); 
    String phoneNo = selectno.getText().toString(); 

    Toast.makeText(getBaseContext(), "total second" + datediff +" "+messagebody +" " +phoneNo, 
      Toast.LENGTH_SHORT).show(); 

    String sql="Insert into smstable values('" + datediff +"','" + messagebody+"','"+phoneNo + " ')"; 
    db.execSQL(sql); 
    db.close(); 
    Toast.makeText(getBaseContext(), "data successfully added", 
      Toast.LENGTH_SHORT).show(); 

    //counter= new MyCount(datediff,1000); 
// counter.start(); 
//Log.d(getClass().getSimpleName(), "onClick: starting srvice"); 
    Toast.makeText(getBaseContext(), "Service started", 
      Toast.LENGTH_SHORT).show(); 

// Intent i=new Intent(); 
//i.putExtra(name, value); 

    startService(new Intent(this, smsservice.class)); 
// smsservice.setMainActivity(this); 

//finish(); 
    break; 

    } 
} 




@Override 
    protected Dialog onCreateDialog(int id) { 
    Calendar c = Calendar.getInstance(); 
    cyear = c.get(Calendar.YEAR); 
    cmonth = c.get(Calendar.MONTH); 
    cdays = c.get(Calendar.DAY_OF_MONTH); 
    switch (id) { 
    case DATE_DIALOG_ID: 
    return new DatePickerDialog(this, mDateSetListener, cyear, cmonth, cdays); 
case time_dialog_id: 
    return new TimePickerDialog(this,mTimeSetListener, 0, 0, false); 
    } 
    return null; 
} 

    private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { 

    public void onDateSet(DatePicker view, int year, int monthOfYear, 
    int dayOfMonth) { 
// TODO Auto-generated method stub 
    String date_selected = String.valueOf(monthOfYear+1)+" /"+String.valueOf(dayOfMonth)+" /"+String.valueOf(year); 


    syear=year; 

    smonth=monthOfYear+1; 
    sdays=dayOfMonth; 

    setdatetomany.setText(date_selected + " { " + smonth +""+ sdays +""+ syear); 

    } 
    }; 


    private TimePickerDialog.OnTimeSetListener mTimeSetListener = 
    new TimePickerDialog.OnTimeSetListener() { 

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
    // TODO Auto-generated method stub 

    //Toast.makeText(sendtomany.this, "Time is="+hourOfDay+":"+minute,  Toas0t.LENGTH_SHORT).show(); 

    String time_selected=String.valueOf(hourOfDay+":"+minute); 
    shour=hourOfDay; 
    smin=minute; 

    settimetomany.setText(time_selected + " "+shour+" "+smin); 
    } 
}; 


    public void onItemSelected(AdapterView<?> parent, View arg1, int arg2, 
long arg3) { 
    // TODO Auto-generated method stub 
    String number=null; 
      Long get=parent.getSelectedItemId(); 
      String s=""+ get; 
      ContentResolver cr = getContentResolver(); 
      Cursor cur = cr.query(People.CONTENT_URI,null, null, null, null); 
      if (cur.getCount() > 0) 
      { 
        while (cur.moveToNext()) 
        { 
        String id = cur.getString(cur.getColumnIndex(People._ID)); 
        //String name = cur.getString(cur.getColumnIndex(People.DISPLAY_NAME)); 
        //String phn=cur.getString(cur.getColumnIndexOrThrow(Contacts.Phones.NUMBER)); 
        Cursor pCur = cr.query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
            null, 
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
            new String[]{id}, null); 
            while (pCur.moveToNext()) { 
            // Do something with phones 
            if(id.endsWith(s)) 
            { 
            number = pCur.getString(pCur.getColumnIndex(Phone.NUMBER)); 
            // 
            selectno.setText(number); 
            } 
            } 
        } 
      } 

    } 



    public void onNothingSelected(AdapterView<?> arg0) { 
    // TODO Auto-generated method stub 

    } 
} 

Service is smsservice.java 

package com.sms; 

import java.util.Calendar; 
import java.util.Date; 
import java.util.Locale; 
import java.util.Timer; 
import java.util.TimerTask; 

    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.PendingIntent; 
    import android.app.Service; 
    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.content.IntentFilter; 
    import android.database.Cursor; 
    import android.database.sqlite.SQLiteDatabase; 
    import android.os.Binder; 
    import android.os.CountDownTimer; 
    import android.os.IBinder; 
    import android.telephony.SmsManager; 
    import android.util.Log; 
    import android.widget.Toast; 

    public class smsservice extends Service{ 

     SQLiteDatabase db=null; 
     String smstable; 
     long currentmillsec; 
     Calendar c; 
     String messagebody; 
     long settime; 
     String phonenumber; 
     MyCount counter; 
     long difftime; 
     int year, month, days, hour, min, sec; 


sendtomany myclass; 
    Timer timer=new Timer(); 

    long UPDATE_INTERVAL = 60*1000; //default 

    long DELAY_INTERVAL = 0; 

@Override 
    public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
    } 


    @Override 
    public void onCreate() { 




     Toast.makeText(getBaseContext(), "service: Oncreated ", 
      Toast.LENGTH_SHORT).show(); 


    c = Calendar.getInstance(); 
    db=openOrCreateDatabase("sms.db", SQLiteDatabase.CREATE_IF_NECESSARY, null); 
    db.setVersion(1); 
    db.setLocale(Locale.getDefault()); 
    db.setLockingEnabled(true); 
    year=c.get(Calendar.YEAR); 
    month=c.get(Calendar.MONTH); 
    month=month+1; 
    days=c.get(Calendar.DAY_OF_MONTH); 
    hour=c.get(Calendar.HOUR_OF_DAY); 
    min=c.get(Calendar.MINUTE); 
    sec=c.get(Calendar.SECOND); 
    currentmillsec=new Date(year,month,days,hour,min,sec).getTime(); 




    String sql="delete from smstable where settime < " + currentmillsec; 
    db.execSQL(sql); 
    Toast.makeText(this, "successfully deleted", Toast.LENGTH_LONG).show(); 

    startactivity(); 

    } 

    public void startactivity() { 
    // TODO Auto-generated method stub 
    Toast.makeText(this, "Activity started from startactivity", Toast.LENGTH_LONG).show(); 

    refreshdata(); 
} 


    @Override 
    public void onDestroy() { 
    if(timer!=null) 
    { 
    timer.cancel(); 
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    } 

} 

    public class MyCount extends CountDownTimer { 
    public MyCount(long millisInFuture, long countDownInterval) { 
     super(millisInFuture, countDownInterval); 
    } 

    public void onFinish() { 
    // timedisplay.setText("Done!"); 

    if (phonenumber.length()>0 && messagebody.length()>0)  
    { 
    String del=","; 
     String[] user=phonenumber.split(del); 

     int index=user.length; 

     for(int i=0;i<index;i++) 
     { 



       sendSMS(user[i], messagebody); 

     } 

     } 
      else 
      { 
       Toast.makeText(getBaseContext(), 
        "Please enter both phone number and message.", 
        Toast.LENGTH_SHORT).show() ; 
    } 

    Toast.makeText(getBaseContext(), " " + messagebody +" " +phonenumber, 
       Toast.LENGTH_SHORT).show(); 















    //restart your service 

    // Context context=null; 
// Intent i=new Intent(); 
// i.setAction("com.sms.smsservice"); 
// context.startActivity(i); 

    } 


public void onTick(long millisUntilFinished) { 
    } 



    } 



    private void sendSMS(String phoneNo, String message) { 
// TODO Auto-generated method stub 

String SENT = "SMS_SENT"; 
     String DELIVERED = "SMS_DELIVERED"; 

     PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
      new Intent(SENT), 0); 

     PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, 
      new Intent(DELIVERED), 0); 

     //---when the SMS has been sent--- 
     registerReceiver(new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context arg0, Intent arg1) { 
       switch (getResultCode()) 
       { 
        case Activity.RESULT_OK: 
         Toast.makeText(getBaseContext(), "SMS sent", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
         Toast.makeText(getBaseContext(), "Generic failure", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_NO_SERVICE: 
         Toast.makeText(getBaseContext(), "No service", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_NULL_PDU: 
         Toast.makeText(getBaseContext(), "Null PDU", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_RADIO_OFF: 
         Toast.makeText(getBaseContext(), "Radio off", 
           Toast.LENGTH_SHORT).show(); 
         break; 
       } 
      } 
     }, new IntentFilter(SENT)); 

     //---when the SMS has been delivered--- 
     registerReceiver(new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context arg0, Intent arg1) { 
       switch (getResultCode()) 
       { 
        case Activity.RESULT_OK: 
         Toast.makeText(getBaseContext(), "SMS delivered", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case Activity.RESULT_CANCELED: 
         Toast.makeText(getBaseContext(), "SMS not delivered", 
           Toast.LENGTH_SHORT).show(); 
         break;       
       } 
      } 
     }, new IntentFilter(DELIVERED));   

     //phonenumber=selectno.getText().toString(); 


     SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(phoneNo, null, message, sentPI, deliveredPI);  
    } 

    public void refreshdata() 
    { 
    Toast.makeText(getBaseContext(), "service: Oncreated at referesh data function", 
       Toast.LENGTH_SHORT).show(); 
//c = Calendar.getInstance(); 
db=openOrCreateDatabase("sms.db", SQLiteDatabase.CREATE_IF_NECESSARY, null); 
     db.setVersion(1); 
     db.setLocale(Locale.getDefault()); 
     db.setLockingEnabled(true); 
    Date(year,month,days,hour,min,sec).getTime(); 




    // String sql="delete from smstable where settime < " + currentmillsec; 
    // db.execSQL(sql); 
    // Toast.makeText(this, "successfully deleted", Toast.LENGTH_LONG).show(); 


     Toast.makeText(getBaseContext(), "service started ", 
       Toast.LENGTH_SHORT).show(); 


Cursor cur=db.rawQuery("Select * from smstable ORDER BY settime", null); 

int row=cur.getCount(); 

    cur.moveToFirst(); 
    int get=cur.getPosition(); 


int settimecount=cur.getColumnIndexOrThrow("settime"); 
int messagecount=cur.getColumnIndexOrThrow("message"); 
int phonenumbercount=cur.getColumnIndexOrThrow("phonenumber"); 

    settime=cur.getLong(settimecount); 
    messagebody=cur.getString(messagecount); 
    phonenumber=cur.getString(phonenumbercount); 


    Toast.makeText(getBaseContext(), " " + currentmillsec + settime , 
       Toast.LENGTH_SHORT).show(); 

    Toast.makeText(getBaseContext(), " " +messagebody+" " +phonenumber , 
       Toast.LENGTH_SHORT).show(); 

     difftime=settime-currentmillsec; 

     Toast.makeText(getBaseContext(), " "+ difftime, 
       Toast.LENGTH_SHORT).show(); 


    counter= new MyCount(difftime,1000); 
    counter.start(); 



    }  



    public void checkmessage() 
    { 

    if (phonenumber.length()>0 && messagebody.length()>0)  
    { 
    String del=","; 
     String[] user=phonenumber.split(del); 

     int index=user.length; 

     for(int i=0;i<index;i++) 
     { 



       sendSMS(user[i], messagebody); 

     } 

     } 
      else 
      { 
       Toast.makeText(getBaseContext(), 
        "Please enter both phone number and message.", 
        Toast.LENGTH_SHORT).show() ; 
    } 

    Toast.makeText(getBaseContext(), " " + messagebody +" " +phonenumber, 
       Toast.LENGTH_SHORT).show(); 


    }  

} 

manifiest file: 

    <receiver android:name=".SmsReceiver"> 
    <intent-filter> 
    <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 

    </intent-filter> 


    </receiver> 

    <!-- <receiver android:name=".smsbrodcast"> 
    <intent-filter> 
    <action android:name="android.intent.action.BOOT_COMPLETED"></action> 

    </intent-filter> 
    android:name=".smsservice" android:enabled="true"> 

    </service> 

回答

1

考慮使用BuzzBox SDK調度您的短信。把你的sendSms代碼的任務,並使用類似安排任務:

SchedulerManager.getInstance() 
    .saveTask(this, "0 6 * * 1,2,3,4,5,6,7|5 6 * * 1,2,3,4,5,6,7", SmsTask.class); 

在cron的字符串表示,在6:00和6:05,在安排您的工作,每一天。 SDK將負責其餘部分。

更多信息​​