2015-03-15 4 views
1

Я делаю приложение для Android ... и я пытаюсь написать код для ежедневного набора уведомлений в течение определенного времени суток. Сначала я действительно думал, что это будет непростая задача, почти каждое приложение в игровом магазине имеет временное уведомление. Но после поиска снова и снова, все методы и учебники Youtube, которые я нашел, не работали для меня. Проблема, вероятно, во мне, но я не знаю, что это такое. Все, что мне нужно, это простой, элегантный, простой для понимания метод (если есть такая вещь). Любая помощь будет принята с благодарностью.Android-приложение с ежедневным уведомлением

Все поиски я сделал попадающая мне это далеко ... но все-таки без удачи:

Этот метод в моем классе MainActivity и называется только первый раз, когда приложение запускается для установки сигнализация ...

private void alarmMethod() { 
    Intent myIntent = new Intent(this, NotifyService.class); 
    AlarmManager alarmMgr = (AlarmManager) getSystemService(ALARM_SERVICE); 
    pendingIntent = PendingIntent.getService(this, 0, myIntent, 0); 

    // Set the alarm to start at approximately 2:00 p.m. 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, 14); 

    // With setInexactRepeating(), you have to use one of the AlarmManager interval 
    // constants--in this case, AlarmManager.INTERVAL_DAY. 
    alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
      AlarmManager.INTERVAL_DAY, pendingIntent); 

    Toast.makeText(MainActivity.this, "Start Alarm", Toast.LENGTH_LONG) 
      .show(); 

Это мой NotifyService класс:

package com.OHS.example; 

import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.app.Service; 
import android.content.Intent; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.os.IBinder; 
import android.support.v4.app.NotificationCompat; 

public class NotifyService extends Service { 

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

@Override 
public void onCreate() { 
    Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 

    NotificationManager mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 
    Intent intent1 = new Intent(this.getApplicationContext(), MainActivity.class); 
    PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent1, 0); 

    Notification mNotify = new NotificationCompat.Builder(this) 
     .setContentTitle("Title") 
     .setContentText("Hello World!") 
     .setSmallIcon(R.drawable.ic_launcher) 
     .setContentIntent(pIntent) 
     .setSound(sound) 
     .build(); 

    mNM.notify(1, mNotify); 

} 
} 

ответ

3

Пробуйте этот код. XML макет:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".MainActivity" > 

<TextView 
    android:id="@+id/TextView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Android Alarm Example:\n\rSetup an alarm event after 10 seconds from the current time. So just press Setup Alarm button and wait for 10 seconds. You can see a toast message when your alarm time will be reach." /> 

    <Button 
     android:id="@+id/setAlarm" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/TextView1" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="25dp" 
     android:onClick="onClickSetAlarm" 
     android:text="Set Alarm" /> 

Основная деятельность:

public class MainActivity extends Activity { 

    //used for register alarm manager 
    PendingIntent pendingIntent; 
    //used to store running alarmmanager instance 
    AlarmManager alarmManager; 
    //Callback function for Alarmmanager event 
    BroadcastReceiver mReceiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //Register AlarmManager Broadcast receive. 
     RegisterAlarmBroadcast(); 
    } 
    public void onClickSetAlarm(View v) 
    { 
     //Get the current time and set alarm after 10 seconds from current time 
     // so here we get 
     alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000 , pendingIntent); 
    } 
    private void RegisterAlarmBroadcast() 
    { 
      Log.i("Alarm Example:RegisterAlarmBroadcast()", "Going to register Intent.RegisterAlramBroadcast"); 

     //This is the call back function(BroadcastReceiver) which will be call when your 
     //alarm time will reached. 
     mReceiver = new BroadcastReceiver() 
     { 
      private static final String TAG = "Alarm Example Receiver"; 
      @Override 
      public void onReceive(Context context, Intent intent) 
      { 
       Log.i(TAG,"BroadcastReceiver::OnReceive() >>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); 
       Toast.makeText(context, "Congrats!. Your Alarm time has been reached", Toast.LENGTH_LONG).show(); 
      } 
     }; 

     // register the alarm broadcast here 
     registerReceiver(mReceiver, new IntentFilter("com.myalarm.alarmexample")); 
     pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent("com.myalarm.alarmexample"),0); 
     alarmManager = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE)); 
    } 
    private void UnregisterAlarmBroadcast() 
    { 
     alarmManager.cancel(pendingIntent); 
     getBaseContext().unregisterReceiver(mReceiver); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 
    @Override 
    protected void onDestroy() { 
     unregisterReceiver(mReceiver); 
     super.onDestroy(); 
    } 
} 

Я надеюсь, что это поможет, это работает для меня. Вы всегда можете рассчитать и установить время, когда вы хотите вызвать будильник. Счастливое кодирование !!

+0

Это абсолютно блестяще ... Я не могу начать описывать, насколько я благодарен. Все это время я пытался начать другое мероприятие, которое отвечает за показ уведомления, и это вызывает проблемы. Я никогда не знал, что могу сделать тот же класс, что и alarmManager, и показать уведомление. Ваше решение элегантно и очень полезно. Спасибо. – OHS

+0

У меня есть одна проблема, хотя .... После того, как будильник был установлен, если я полностью завершу приложение (из окна многозадачности), сигнал тревоги не погаснет, и я не получаю уведомление. Я даже попытался удалить метод 'onDestroy()', но это не помогло. Любые идеи, как я могу сделать будильник, даже если приложение в настоящее время не запущено? – OHS

+0

Насколько я понимаю вашу проблему выше, не удаляйте метод onDestroy(), комментируйте только метод unregisterReceiver(). это будет сделано. – Trideep

1

Вы можете использовать AlarmManager планировать ежедневные уведомления. Документ here дает хорошее объяснение и пример.

Настройка будильника.

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    PendingIntent pendingIntent = PendingIntent.getService(this, 0, 
    new Intent(this, MainService.class), 
     PendingIntent.FLAG_UPDATE_CURRENT); 
    Calendar calendar = Calendar.getInstance(); 
    // set the triggered time to currentHour:08:00 for testing 
    calendar.set(Calendar.SECOND, 0); 
    calendar.set(Calendar.MINUTE, 8); 

    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
      calendar.getTimeInMillis(), 0, pendingIntent); 

Служба для обработки тревоги.

public class MainService extends IntentService { 

    public MainService() { 
     super("mainservice"); 
    } 

    public MainService(String name) { 
     super(name); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see android.app.IntentService#onHandleIntent(android.content.Intent) 
    */ 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     showNotification(); 
    } 

    private void showNotification() { 

     Uri soundUri = RingtoneManager 
       .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    Notification notification = new NotificationCompat.Builder(this) 
       .setContentTitle("Alarm title") 
       .setContentText("Alarm text") 
       .setContentIntent(
         PendingIntent.getActivity(this, 0, new Intent(this, 
           SecondActivity.class), 
           PendingIntent.FLAG_UPDATE_CURRENT)) 
       .setSound(soundUri).setSmallIcon(R.drawable.ic_launcher) 
       .build(); 
     NotificationManagerCompat.from(this).notify(0, notification); 
    } 

} 
+0

Очень ценим ... но я уже пробовал это ... Мне следовало бы написать код с моим вопросом. К сожалению, я немного новичок в этом. Я отредактирую его через секунду. – OHS

+0

Как вы можете видеть ... Эта первая часть кода, которую я получил из того же документа, который вы мне прислали .... И вторая часть, полученная из другого учебника, я попытался сделать уведомление, когда я нажимаю кнопка ... и это сработало, поэтому проблема не должна быть во второй части. Что-то не так в первом? – OHS

+0

@OHS Ваш первая часть кажется правильный. Но вторая часть кажется не совсем правильной. Вы не должны отправлять уведомление в callback 'onCreate', он вызывается только один раз, когда служба сначала создается. Я думаю, вы не видели, что уведомление вызвано тем, что ваша служба уже создана, 'onCreate' не будет вызывать. – alijandro

0

, как alijandro сказал, что если вы хотите иметь ежедневное уведомление в определенное время, вы можете использовать AlarmManager планировать его и в то время показа уведомления или, если вы хотите получить данные с сервера, отправить запрос HTTP, чтобы получить ваши данные и показать уведомление пользователю. Но если вы хотите получать push-уведомление в любое время, вы можете использовать GCM (Google Cloud Messaging). Посмотрите на это doc.

Смежные вопросы