通过使用后台服务将系统时间与数据库值进行比较,android中的通知无法正常工作

时间:2012-07-23 18:28:42

标签: android

我正在开发一个Android应用程序。我想每天提供五个通知。我会将通知时间存储在sqlite数据库中。然后我将这个数据库通知时间与使用service的重复循环中的设备时间进行比较。但是通知将无法正常工作.Forceclose出现了。我已经给出了两个类文件三,java和MyService下面.......我需要帮助

     Third.java

   public class third extends Activity {
/** Called when the activity is first created. */
Button btnopen;
Spinner spin1,spin2,spin3,spin4,spin5;
EditText t1,t2,t3,t4,t5;
String fajr,zuhr,asr,magrib,isha;
String[] item={"","2-Times Allahu akbar","3-Beep once"};
example r=new example();
private static final String DATABASE_NAME = "MYPRAYER.db";   
private static final String DATABASE_TABLE = "notification";
private static final String DATABASE_CREATE = "create table "+DATABASE_TABLE+"(id integer primary key autoincrement , fajr varchar not null , zuhr varchar not null , asr varchar not null , magrib varchar not null , isha varchar not null );"; 

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.page3);
   /* Call the service */
    Intent i = new Intent();
    i.setClassName( "org.prayer.test","org.prayer.test.MyService" );
    bindService( i, null, Context.BIND_AUTO_CREATE);
    this.startService(i); 
    /*  Populate the spinner */
btnopen=(Button)findViewById(R.id.button1);
t1=(EditText)findViewById(R.id.editText1);
t2=(EditText)findViewById(R.id.editText2);
t3=(EditText)findViewById(R.id.editText3);
t4=(EditText)findViewById(R.id.editText4);
t5=(EditText)findViewById(R.id.editText5);
spin1=(Spinner)findViewById(R.id.spinner1);
spin2=(Spinner)findViewById(R.id.spinner3);
spin3=(Spinner)findViewById(R.id.spinner4);
spin4=(Spinner)findViewById(R.id.spinner6);
spin5=(Spinner)findViewById(R.id.spinner7);
ArrayAdapter<String> a1=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,item);
a1.setDropDownViewResource(android.R.layout.simple_spinner_item);
spin1.setAdapter(a1);
spin2.setAdapter(a1);
spin3.setAdapter(a1);
spin4.setAdapter(a1);
spin5.setAdapter(a1);

         /* Notification time stored on the database */
try
{
        SQLiteDatabase myDB;
        //myDB = openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
        myDB = SQLiteDatabase.openDatabase("/data/data/org.prayer.test/databases/MYPRAYER.db",null,SQLiteDatabase.CREATE_IF_NECESSARY);

        //myDB.execSQL(DATABASE_CREATE);
        myDB.execSQL(DATABASE_CREATE);
        myDB = openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
        ContentValues newRow = new ContentValues();
        newRow.put("id", "1");
        newRow.put("fajr", "0:00 AM");
        newRow.put("zuhr", "0:00 AM");
        newRow.put("asr", "0:00 AM");
        newRow.put("magrib", "0:00 AM");
        newRow.put("isha", "0:00 AM");
        myDB.insert(DATABASE_TABLE, null, newRow);
        myDB.close();
}
catch(SQLiteException ex)
{
    //Do nothing
    //System.out.println(ex.getMessage());
}

btnopen.setOnClickListener(new OnClickListener() {
      @Override
    public void onClick(View v) {

         fajr=t1.getText().toString();
         zuhr=t2.getText().toString();
         asr=t3.getText().toString();
         magrib=t4.getText().toString();
         isha=t5.getText().toString();

        SQLiteDatabase myDB;
        myDB = openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
        ContentValues newRow = new ContentValues();
        newRow.put("id", "1");
        newRow.put("fajr", fajr);
        newRow.put("zuhr", zuhr);
        newRow.put("asr", asr);
        newRow.put("magrib", magrib);
        newRow.put("isha", isha);
        myDB.update(DATABASE_TABLE, newRow,"id" + "=" + "1",null);
        Toast.makeText(getApplicationContext(), "row updated", Toast.LENGTH_SHORT).show();
        myDB.close();
  }

});

} }

MyService.java

ppublic class MyService extends Service {
              private static final String DATABASE_NAME = "MYPRAYER.db";   
              private static final String DATABASE_TABLE = "notification";
              String tag="TestService";
                String a="hello";
                String res1,res2,res3,res4,res5;
                int hour,minute;
                String day3,day4,minute1,hour1;
                MediaPlayer mMediaPlayer;
                   /* Service creation */
               @Override
               public void onCreate() {
             super.onCreate();
               Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show();      
               Log.i(tag, "Service created...");


                  /* Rereive notification times from the databse notificaion */
              SQLiteDatabase myDB;
            myDB = openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
            String[] resultColumns = new String[] {"fajr","zuhr","asr","magrib","isha"};
            Cursor allRows = myDB.query(DATABASE_TABLE, resultColumns, null, null, null, null, null, null);

            Integer cindex = allRows.getColumnIndex("fajr");
            Integer cindex1 = allRows.getColumnIndex("zuhr");
            Integer cindex2 = allRows.getColumnIndex("asr");
            Integer cindex3 = allRows.getColumnIndex("magrib");
            Integer cindex4 = allRows.getColumnIndex("isha");
            allRows.moveToFirst();
            res1=allRows.getString(cindex);
            res2=allRows.getString(cindex1);
            res3=allRows.getString(cindex2);
            res4=allRows.getString(cindex3);
            res5=allRows.getString(cindex4);


            myDB.close();

            while(!Thread.currentThread().isInterrupted())
            {
            try 
            {

                Calendar cal = Calendar.getInstance(); // Rereive calender date
                hour = cal.get(Calendar.HOUR_OF_DAY); // Take hour from the calender
                minute = cal.get(Calendar.MINUTE);    // Take minute from the calender
                minute1=minute + "";  // Convert minute to dtring
                if(minute1.equals("1")) 
                {
                minute1="01";
                }
                else if(minute1.equals("2"))
                {
                minute1="02";
                }
                else if(minute1.equals("3"))
                {
                minute1="03";
                }
                else if(minute1.equals("4"))
                {
                minute1="04";
                }
                else if(minute1.equals("5"))
                {
                minute1="05";
                }
                else if(minute1.equals("6"))
                {
                minute1="06";
                }
                else if(minute1.equals("7"))
                {
                minute1="07";
                }
                else if(minute1.equals("8"))
                {
                minute1="08";
                }
                else if(minute1.equals("9"))
                {
                minute1="09";
                }
                     /* Converting to 12 hour format */
                if ( hour < 12 )
                {
                     hour=hour;
                     day3=hour + "" + ":" + minute1;
                     day4=day3 + " " + "AM"; // DAY4 Contains the system time
                }
                else
                {
                    hour=hour-12;
                    day3=hour + "" + ":" + minute1;
                    day4=day3 + " " + "PM";
                }



                if(day4.equals(res1))
              {
                     Notification("Notification Title","Notification Message");


              }



                 if(day4.equals(res2))
                  {
                         Notification("Notification Title","Notification Message");

                  }


                 if(day4.equals(res3))
                  {
                         Notification("Notification Title","Notification Message");

                  } 
                 if(day4.equals(res4))
                  {
                         Notification("Notification Title","Notification Message");

                  }
                 if(day4.equals(res5))
                  {
                         Notification("Notification Title","Notification Message");

                  }

               Thread.sleep(1000);
       } 
       catch (InterruptedException e)
       {
               Thread.currentThread().interrupt();
               //System.out.println("New 1 Exception here");

       }

       catch (Exception e)
      {
               //Thread.currentThread().interrupt();
           System.out.println("nEW Exception here");
      }          
       }

       }         
          @Override
          public void onStart(Intent intent, int startId) {      
          super.onStart(intent, startId);  
          Log.i(tag, "Service started...");
       }
         @Override
         public void onDestroy() {
         super.onDestroy();
         Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show();
       }

         @Override
         public IBinder onBind(Intent intent) {
         return null;
        }

         private  void Notification(String notificationTitle, String notificationMessage)
       {
         NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
         Notification notification = new Notification(R.drawable.ic_launcher, "A New Message!", System.currentTimeMillis());

         Intent notificationIntent = new Intent(this,MyService.class);
         PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

         notification.setLatestEventInfo(MyService.this, notificationTitle, notificationMessage, pendingIntent);
         notificationManager.notify(10001, notification);
   //HELLO_ID++;
         Uri alert = RingtoneManager.getDefaultUri(
        RingtoneManager.TYPE_NOTIFICATION); 

        mMediaPlayer = new MediaPlayer();
      try
      {
      mMediaPlayer.setDataSource(this, alert);

      AudioManager audioManager = (AudioManager)getSystemService(
                                  Context.AUDIO_SERVICE);
      int volumen = audioManager.getStreamVolume(
                    AudioManager.STREAM_NOTIFICATION);

      if (volumen != 0) {
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
        mMediaPlayer.setLooping(true);
        mMediaPlayer.prepare();
        mMediaPlayer.start();
      }
      }
      catch(IOException e)
      {  
          System.out.println("Exception here");
          //System.out.println("Exception 1 here");
      }
      }
          }

Lgcat:

07-27 16:24:52.591:E / global(363):不支持弃用的Thread方法。 07-27 16:24:52.591:E / global(363):java.lang.UnsupportedOperationException 07-27 16:24:52.591:E / global(363):at java.lang.VMThread.stop(VMThread.java:85) 07-27 16:24:52.591:E / global(363):at java.lang.Thread.stop(Thread.java:1379) 07-27 16:24:52.591:E / global(363):at java.lang.Thread.stop(Thread.java:1344) 07-27 16:24:52.591:E / global(363):at org.prayer.test.splash $ 1.run(splash.java:71) 07-27 16:24:53.002:D / dalvikvm(363):GC在108ms内释放了879个对象/ 65552个字节 07-27 16:25:00.542:I / TestService(363):已创建服务... 07-27 16:25:20.752:I / dalvikvm(363):threadid = 7:对信号3作出反应 07-27 16:25:20.803:I / dalvikvm(363):将堆栈跟踪写入'/data/anr/traces.txt'

1 个答案:

答案 0 :(得分:0)

如果您的目标是在一天中的固定时间触发通知,请使用AlarmManager执行此操作,如下所示:

  1. 当应用程序第一次启动时,保存那些EditText值等,就像现在一样 - 然后设置AlarmManager以在最近的通知时间唤醒您的服务。
  2. 在服务中,发布通知,设置下一个警报,然后设置stopSelf()。
  3. 此循环将继续。

    关于力关闭,粘贴你的logcat。你的代码不是很整齐,变量没有有意义的命名,所以很难分辨。