2016-04-01 4 views
0

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

MainActivity.java

public class MainActivity extends AppCompatActivity { 


    // This is a handle so that we can call methods on our service 
    private ScheduleClient scheduleClient; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    scheduleClient = new ScheduleClient(this); 
    scheduleClient.doBindService(); 
} 

public void onDateSelectedClickEvent(View v) { 
    // Get the date from our datepicker 
    int day = 1; 
    int month = 4; 
    int year = 2016; 
    // Create a new calendar set to the date chosen 
    // we set the time to midnight (i.e. the first minute of that day) 
    Calendar c = Calendar.getInstance(); 
    c.set(year, month, day); 
    c.set(Calendar.HOUR_OF_DAY, 0); 
    c.set(Calendar.MINUTE, 0); 
    c.set(Calendar.SECOND, 0); 
    // Ask our service to set an alarm for that date, this activity talks to 
    // the client that talks to the service 
    scheduleClient.setAlarmForNotification(c); 
    // Notify the user what they just did 
    Toast.makeText(
      this, 
      "Notification set for: " + day + "/" + (month) + "/" + year, 
      Toast.LENGTH_SHORT).show(); 
} 

@Override 
protected void onStop() { 
    // When our activity is stopped ensure we also stop the connection to the service 
    // this stops us leaking our activity into the system *bad* 
    if(scheduleClient != null) 
     scheduleClient.doUnbindService(); 
    super.onStop(); 
} 

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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

}

AlarmTask.java

public class AlarmTask implements Runnable { 

private final Calendar date; 
// The android system alarm manager 
private final AlarmManager am; 
// Your context to retrieve the alarm manager from 
private final Context context; 

public AlarmTask(Context context, Calendar date) { 
    this.context = context; 
    this.am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    this.date = date; 
} 

@Override 
public void run() { 
    // Request to start are service when the alarm date is upon us 
    // We don't start an activity as we just want to pop up a notification into the system bar not a full activity 
    Intent intent = new Intent(context, NotifyService.class); 
    intent.putExtra(NotifyService.INTENT_NOTIFY, true); 
    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

    // Sets an alarm - note this alarm will be lost if the phone is turned off and on again 
    am.set(AlarmManager.RTC, date.getTimeInMillis(), pendingIntent); 
} 

}

ScheduleService.java

public class ScheduleService extends Service { 

public class ServiceBinder extends Binder { 
    ScheduleService getService() { 
     return ScheduleService.this; 
    } 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i("ScheduleService", "Received start id " + startId + ": " + intent); 

    // We want this service to continue running until it is explicitly stopped, so return sticky. 
    return START_STICKY; 
} 

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

// This is the object that receives interactions from clients. See 
private final IBinder mBinder = new ServiceBinder(); 

/** 
* Show an alarm for a certain date when the alarm is called it will pop up a notification 
*/ 
public void setAlarm(Calendar c) { 
    // This starts a new thread to set the alarm 
    // You want to push off your tasks onto a new thread to free up the UI to carry on responding 
    new AlarmTask(this, c).run(); 
} 

}

NotifyService.java

public class NotifyService extends Service { 

public class ServiceBinder extends Binder { 
    NotifyService getService() { 
     return NotifyService.this; 
    } 
} 

// Unique id to identify the notification. 
private static final int NOTIFICATION = 123; 
// Name of an intent extra we can use to identify if this service was started to create a notification 
public static final String INTENT_NOTIFY = "com.blundell.tut.service.INTENT_NOTIFY"; 
// The system notification manager 
private NotificationManager mNM; 

@Override 
public void onCreate() { 
    Log.i("NotifyService", "onCreate()"); 
    mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i("LocalService", "Received start id " + startId + ": " + intent); 

    // If this service was started by out AlarmTask intent then we want to show our notification 
    if(intent.getBooleanExtra(INTENT_NOTIFY, false)) 
     showNotification(); 

    // We don't care if this service is stopped as we have already delivered our notification 
    return START_NOT_STICKY; 
} 

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

// This is the object that receives interactions from clients 
private final IBinder mBinder = new ServiceBinder(); 

/** 
* Creates a notification and shows it in the OS drag-down status bar 
*/ 
private void showNotification() { 
    // This is the 'title' of the notification 
    CharSequence title = "Alarm!!"; 
    // This is the icon to use on the notification 
    int icon = R.drawable.ic_launcher; 
    // This is the scrolling text of the notification 
    CharSequence text = "Your notification time is upon us."; 
    // What time to show on the notification 
    long time = System.currentTimeMillis(); 

    // Notification notification = new Notification(icon, text, time); 


    Notification notification; 
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SecondActivity.class), 0); 


    NotificationCompat.Builder builder = new NotificationCompat.Builder(
      this); 
    notification = builder.setContentIntent(contentIntent) 
      .setSmallIcon(icon).setTicker(text).setWhen(time) 
      .setAutoCancel(true).setContentTitle(title) 
      .setContentText(text).build(); 
    mNM.notify(NOTIFICATION, notification); 



    // The PendingIntent to launch our activity if the user selects this notification 

    // PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SecondActivity.class), 0); 

    // Set the info for the views that show in the notification panel. 

    //notification.setLatestEventInfo(this, title, text, contentIntent); 

    // Clear the notification when it is pressed 

    // notification.flags |= Notification.FLAG_AUTO_CANCEL; 

    // Send the notification to the system. 

    //mNM.notify(NOTIFICATION, notification); 

    // Stop the service when we are finished 
    stopSelf(); 
} 

}

ScheduleClient.java

public class ScheduleClient { 


// The hook into our service 
private ScheduleService mBoundService; 
// The context to start the service in 
private Context mContext; 
// A flag if we are connected to the service or not 
private boolean mIsBound; 

public ScheduleClient(Context context) { 
    mContext = context; 
} 

/** 
* Call this to connect your activity to your service 
*/ 
public void doBindService() { 
    // Establish a connection with our service 
    mContext.bindService(new Intent(mContext, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE); 
    mIsBound = true; 
} 

/** 
* When you attempt to connect to the service, this connection will be called with the result. 
* If we have successfully connected we instantiate our service object so that we can call methods on it. 
*/ 
private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     // This is called when the connection with our service has been established, 
     // giving us the service object we can use to interact with our service. 
     mBoundService = ((ScheduleService.ServiceBinder) service).getService(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     mBoundService = null; 
    } 
}; 

/** 
* Tell our service to set an alarm for the given date 
* @param c a date to set the notification for 
*/ 
public void setAlarmForNotification(Calendar c){ 
    mBoundService.setAlarm(c); 
} 

/** 
* When you have finished with the service call this method to stop it 
* releasing your connection and resources 
*/ 
public void doUnbindService() { 
    if (mIsBound) { 
     // Detach our existing connection. 
     mContext.unbindService(mConnection); 
     mIsBound = false; 
    } 
} 

}

SecondActivity.java

public class SecondActivity extends Activity { 

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

}

AndroidManifest.xml

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".SecondActivity" /> 

    <service android:name=".ScheduleService" /> 
    <service android:name=".NotifyService" /> 
</application> 

+2

Вопросы, желающие отладка help («почему этот код не работает?») должен включать в себя желаемое поведение, конкретную проблему или ошибку и ** кратчайший необходимый код **, чтобы воспроизвести его в самом вопросе. – F43nd1r

ответ

0

Возможно сократить ур код этого учебного курса для конкретного уведомления времени и повторения уведомления время http://smartandroidians.blogspot.in/2010/04/alarmmanager-and-notification-in.html

+0

спасибо за ответ, но я узнаю уведомление на конкретную дату без выбора даты –

+0

@MalikMohmmadnaimMustakahmed получить дату с даты выбора и установить его в c.setDate («Ваша дата»); –

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