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>