如何在android中没有datepicker的特定日期生成通知

时间:2016-04-01 04:48:11

标签: android android-notifications

我将尝试静态地给出具体的日期,但它不能生成通知,但我从日期选择器中选择日期然后我将正常工作。这是我的代码。

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>

1 个答案:

答案 0 :(得分:0)

可以减少代码按照本教程的具体时间通知和重复时间通知http://smartandroidians.blogspot.in/2010/04/alarmmanager-and-notification-in.html