2012-02-02 3 views
2

Здравствуйте, я новичок в Java и Android, я пытаюсь использовать будильник с хронометром для отображения тоста каждые 10 секунд после нажатия кнопки startButton. Ничего не происходит через 10 секунд, и я не знаю, почему.Товаровую сигнализацию Alarmmanager с интервалами

Можете ли вы просмотреть мой код и помочь мне определить и устранить проблемы?

Thankyou.

переменные - journeycount = хронометр, pendingIntent mAlarmSender

главный класс - SafeDrive3Activity

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

      journeycount = (Chronometer) findViewById(R.id.journeycount); 
      // Watch for button clicks. 
      startButton = (Button) findViewById(R.id.startButton); 
      startButton.setOnClickListener(mStartListener); 

      resetButton = (Button) findViewById(R.id.resetButton); 
      resetButton.setOnClickListener(mResetListener); 

     } 

View.OnClickListener mStartListener = new OnClickListener() { 
    public void onClick(View v) { 

     int stoppedMilliseconds = 0; 

     String chronoText = journeycount.getText().toString(); 
     String array[] = chronoText.split(":"); 

     if (array.length == 2) { 
     stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 1000 
      + Integer.parseInt(array[1]) * 1000; 
     } else if (array.length == 3) { 
     stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 60 * 1000 
      + Integer.parseInt(array[1]) * 60 * 1000 
      + Integer.parseInt(array[2]) * 1000; 
     } 

     journeycount.setBase(SystemClock.elapsedRealtime() - stoppedMilliseconds); 
     journeycount.start(); 
     startButton.setText("Driving..."); // changes button text value to 'Driving...' 
     startButton.setOnClickListener(mStartListener); 

     Calendar cal = Calendar.getInstance(); 
     cal.setTimeInMillis(System.currentTimeMillis()); 
     // add 10 seconds to calendar object 
     cal.add(Calendar.SECOND, 10); 
     mAlarmSender = PendingIntent.getBroadcast(SafeDrive3Activity.this, 
       0, new Intent(SafeDrive3Activity.this, MyTimeReceiver.class), 0); 

     // Schedule the alarm! 
     AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
     am.set(AlarmManager.RTC_WAKEUP, 
         cal.getTimeInMillis(), mAlarmSender); 

    } 
    }; 

     View.OnClickListener mResetListener = new OnClickListener() { 
       public void onClick(View v) { 
        Button startButton; 
        startButton = (Button) findViewById(R.id.startButton); 
        startButton.setOnClickListener(mStartListener); 
        journeycount.setBase(SystemClock.elapsedRealtime()); 

        startButton.setText("Start Driving"); 
        journeycount.setText("00:00"); 
        journeycount.stop(); 

        AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
        am.cancel(mAlarmSender); 


       } 
     }; 


       };  

Второй класс:

public class MyTimeReceiver extends BroadcastReceiver 

{ 
    @Override 
     public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "HOUR NOTIFICATION", Toast.LENGTH_LONG).show(); 

      } 
     } 

Manifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.Safe" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="14" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:label="@string/app_name" 
     android:name=".SafeDrive3Activity" > 
     <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    <receiver android:name="MyTimeReceiver"></receiver> 
     </activity> 
    </application> 
</manifest> 
+0

все еще пытаются получить тост показать, я думаю, что его просто небольшая проблема с кодом, любые идеи :(? – Rob

ответ

1

Я думаю, вы должны рассмотреть другой подход в этом сценарии. Почему бы не использовать таймер, который просто запускает сообщения с тостами?

Timer timer = new Timer(); 
timer.schedule(new TimerTask() { 
    public void run() { 
     Toast.makeText(SafeDrive3Activity.this, "Whatever", Toast.LENGTH_LONG).show(); 
    } 
}, 0, 10000); 
+0

Как отключить задачу таймера в методе onDestroy класса обслуживания? –

0

использование ниже управляющего сигнала тревоги кодового набора

am.set(AlarmManager.RTC_WAKEUP, 
        SystemClock.elapsedRealtime(),mAlarmSender); 
+0

спасибо за ответ. Я изменил его на код выше, но текст для тоста не появляется на 10 секунд. Я получаю сообщение об ошибке ниже, когда намерение запущено на e mulator, что-нибудь с этим связано? SafeDrive3] ActivityManager: Предупреждение: активность не запущена, ее текущая задача была перенесена на передний план – Rob

+0

очистить проект и снова запустить –

+0

Выполнено. Я не думаю, что вышеупомянутые изменения решили проблему. Нет тоста текст показывается через 10 секунд :( – Rob

0

Попробуйте использовать код ниже:

AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
Intent serviceIntent = new Intent(context, MyService.class); 
PendingIntent pi = PendingIntent.getService(context, 0, serviceIntent, 0); 
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 10000, pi); 

Я не использовал BroadcastReviver. Я звонил в Службу каждые 10 секунд.

Новое решение:

AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
Intent serviceIntent = new Intent(context, MyActivity.class); 
PendingIntent pi = PendingIntent.getService(context, 0, serviceIntent, 0); 
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 10000, pi); 

MyActivity:

public class MyActivity extends Activity { 
     @Override 
      public void onCreate(Bundle savedInstanceState) { 
      Toast.makeText(context, "HOUR NOTIFICATION", Toast.LENGTH_LONG).show(); 
      } 
} 
+0

делает это зайдите в основной класс активности, где идет код для тоста? – Rob

+0

Я запускаю MyService.class каждые 10 секунд. Вы можете определить свой собственный сервис или активность и установить его, когда объявляете свой ожидающий ответ: Intent serviceIntent = new Intent (контекст, YourServiceOrActivity.class); PendingIntent pi = PendingIntent.getService (контекст, 0, serviceIntent, 0); – Alex

+0

В вашей службе или мероприятии вы можете поместить код для тоста. Вместо этого вы должны создать Сервис или действие of BroadcastReciver. – Alex