使用BroadcastReceiver通知某个时间甚至应用程序已关闭

时间:2015-02-03 08:50:58

标签: java android

我在这里尝试做的是通过使用BroadcastReceiver在一定时间后发出通知。通过以下代码集我也能够实现。但我希望即使申请被关闭也会提出通知。

MainActivity.java

public class MainActivity extends Activity {

IntentFilter ii;
TimeReciever tr;

 protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ii=new IntentFilter("android.intent.action.TIME_TICK");
tr=new TimeReciever();
registerReceiver(tr, ii);

 }

}
   =================================

 TimeReciever.java

  public class TimeReciever extends BroadcastReceiver{
    int a=0;
    public void onReceive(Context ctx, Intent in) {
     System.out.println("On reciever");
     a+=a;
     a++;
     System.out.println("value of a="+a);
    if(a==31){
    Toast.makeText(ctx,"Reciver Executed ", 40).show();
    showNotification(ctx);
    }

    }

private void showNotification(Context context) {
    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle("Log Reminder")
            .setContentText("It's time to log the Breakfast !");

   // Creates an explicit intent for an Activity in your app
    Intent resultIntent = new Intent(context, MainActivity.class);


    // started Activity.
    // This ensures that navigating backward from the Activity leads out of
    // your application to the Home screen.
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    // Adds the back stack for the Intent (but not the Intent itself)
    stackBuilder.addParentStack(MainActivity.class);
    // Adds the Intent that starts the Activity to the top of the stack
    stackBuilder.addNextIntent(resultIntent);
    PendingIntent resultPendingIntent =
            stackBuilder.getPendingIntent(
                0,
                PendingIntent.FLAG_UPDATE_CURRENT
            );
    mBuilder.setContentIntent(resultPendingIntent);
    mBuilder.setContentIntent(resultPendingIntent);
    mBuilder.setDefaults(Notification.DEFAULT_SOUND);
    NotificationManager mNotificationManager =
            (NotificationManager)      context.getSystemService(Context.NOTIFICATION_SERVICE);
    // mId allows you to update the notification later on.

  mNotificationManager.notify(1, mBuilder.build());
  a=0;

}

}

         ===============================
 Manifest.xml

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

<uses-sdk
    android:minSdkVersion="16"
    android:targetSdkVersion="19" />


<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >



    <receiver android:name="com.example.notificationbybroadcastre.TimeReciever">
        <intent-filter>
            <action android:name="android.intent.action.TIME_TICK"/>
        </intent-filter>
    </receiver>

 <activity
        android:name="com.example.notificationbybroadcastre.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>
</application>

</manifest>

1 个答案:

答案 0 :(得分:0)

 Here The Answer.I have done It Through AlaramManager.


Main Activity

 ===============

  public class MainActivity extends Activity 
 {

private PendingIntent pendingIntent;

@Override
public void onCreate(Bundle savedInstanceState) 
{

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);

pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,0);

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 30);

// setRepeating() lets you specify a precise custom interval--in this case,
// 20 minutes.
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,    calendar.getTimeInMillis(),
        1000 * 60 * 480, pendingIntent);

} //end onCreate


}
   ================================================================

 MyAlarmService.java

   ================================




  public class MyAlarmService extends Service 

   {
 private NotificationManager mManager;

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

@Override
public void onCreate() 
{
   // TODO Auto-generated method stub  
   super.onCreate();
}

 @SuppressWarnings("static-access")
 @Override
public void onStart(Intent intent, int startId)
 {  

   showNotification(this);
 }



    private void showNotification(Context context) {
    NotificationCompat.Builder mBuilder =
           new NotificationCompat.Builder(context)
           .setSmallIcon(R.drawable.ic_launcher)
           .setContentTitle("Meal Log Reminder")
           .setContentText("It's time to log Your Meal!");

  // Creates an explicit intent for an Activity in your app
   Intent resultIntent = new Intent(context, MainActivity.class);

   // The stack builder object will contain an artificial back stack for the
   // started Activity.
   // This ensures that navigating backward from the Activity leads out of
   // your application to the Home screen.
   TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
   // Adds the back stack for the Intent (but not the Intent itself)
   stackBuilder.addParentStack(MainActivity.class);
   // Adds the Intent that starts the Activity to the top of the stack
   stackBuilder.addNextIntent(resultIntent);
   PendingIntent resultPendingIntent =
           stackBuilder.getPendingIntent(
               0,
               PendingIntent.FLAG_UPDATE_CURRENT
           );
   mBuilder.setContentIntent(resultPendingIntent);
   mBuilder.setContentIntent(resultPendingIntent);
   mBuilder.setDefaults(Notification.DEFAULT_ALL);

   NotificationManager mNotificationManager =
           (NotificationManager)    context.getSystemService(Context.NOTIFICATION_SERVICE);
   // mId allows you to update the notification later on.

 mNotificationManager.notify(1, mBuilder.build());




   }

@Override
public void onDestroy() 
{
    // TODO Auto-generated method stub
    super.onDestroy();
}

 }

    ===================================================

    MyReceiver.java

 =========================

  public class MyReceiver extends BroadcastReceiver
  {

@Override
 public void onReceive(Context context, Intent intent)
{
   Intent service1 = new Intent(context, MyAlarmService.class);
   context.startService(service1);

 }

 }