2013-07-18 43 views
0

我制作了一个android应用程序,可以在当天的特定时间(比如说6:15:00 pm)显示通知消息。我已经使用日历以及AlarmManager类为此目的。闹钟管理器每次都会显示通知

但是,当我在手机上安装应用程序进行测试时,它在指定时间向我显示了消息/通知,但随时都会显示相同的消息。我的意思是通知不断显示在我的手机中,即使我已经在我的应用程序中设定了时间。

这是我的代码 1)Activity类

import java.util.Calendar; 
import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Intent; 
import android.os.Bundle; 


public class MainActivity extends Activity 
{ 

    private PendingIntent pendingIntent; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 

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


Calendar calendar = Calendar.getInstance(); 

calendar.set(Calendar.MONTH, 6); 
calendar.set(Calendar.YEAR, 2013); 
calendar.set(Calendar.DAY_OF_MONTH, 13); 

calendar.set(Calendar.HOUR_OF_DAY, 20); 
calendar.set(Calendar.MINUTE, 48); 
calendar.set(Calendar.SECOND, 0); 
calendar.set(Calendar.AM_PM,Calendar.PM); 

Intent myIntent = new Intent(MainActivity.this, MyReceiver.class); 
pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,0); 

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent); 

} //end onCreate 

} 

2)接收

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

    public class MyReceiver extends BroadcastReceiver 
    { 

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

    } 

} 

3)服务类

import android.app.Notification; 
    import android.app.NotificationManager; 
    import android.app.PendingIntent; 
    import android.app.Service; 
    import android.content.Intent; 
    import android.os.IBinder; 


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) 
    { 
    super.onStart(intent, startId); 

    mManager = (NotificationManager) this.getApplicationContext().getSystemService(this.getApplicationContext().NOTIFICATION_SERVICE); 
    Intent intent1 = new Intent(this.getApplicationContext(),MainActivity.class); 

    Notification notification = new Notification(R.drawable.ic_launcher,"This is a test message!", System.currentTimeMillis()); 

    intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP); 

    PendingIntent pendingNotificationIntent = PendingIntent.getActivity(this.getApplicationContext(),0, intent1,PendingIntent.FLAG_UPDATE_CURRENT); 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 
    notification.setLatestEventInfo(this.getApplicationContext(), "AlarmManagerDemo", "This is a test message!", pendingNotificationIntent); 

    mManager.notify(0, notification); 
} 

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

}

我有加在manifest.xml文件中编辑服务和接收者。请任何人都可以告诉我,我应该怎么做才能在整个一天内只显示一次通知?

回答

1

我猜的原因是的onCreate方法被多次调用,所以你的alarmManager.set被多次调用。例如,每当屏幕方向发生变化时,该活动就会被销毁,并且一个新的活动由onCreate()方法启动。因此,每当你旋转屏幕时,活动将被销毁,并且一个新的活动由onCreate()方法启动并且alarmManager.set被再次调用。

您可以在onSaveInstanceState(Bundle bundle)方法中保存状态成员。只要屏幕旋转,Android就调用这个方法,并且给定的bundle bundle将被传递给oncreate(Bundle bundle)。在你的onCreate中,在尝试调用alarmManager.set之前检查Bundle为null。

+0

是的,我明白你的意思了。你可以建议我的代码应该做些什么改变才能实现这个目标? –

+0

感谢这工作!除了我指定的时间,我没有收到任何通知消息...希望它会一直显示相同的...如果有任何问题,我会在这里发表评论 –

+0

@ParthDoshi我面临同样的问题你能告诉我你是如何检查捆绑在创建..预先感谢.. –

1

我没有用不完的BroadcastReceiver像

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

所以我怀疑广播接收器的使用是否是错误的,通常我们使用了BroadcastReceiver如下:

<receiver android:name=".MyReceiver"> 
    <intent-filter> 
     <action android:name="mypackage.START_ALARM" ></action> 
    </intent-filter> 
</receiver> 

Intent i = new Intent("mypackage.START_ALARM"); 
+0

是的,我改变了我的意图,以及接收器的清单,但它仍然没有工作...我得到通知不止一次白天.. ..应该只在一天中的某个特定时间,而不是其他任何时间 –

1

尝试此其工作对我罚款:

Calendar cal = Calendar.getInstance(); 

    cal.set(Calendar.HOUR_OF_DAY, 11); 
    cal.set(Calendar.MINUTE, 54); 
    cal.set(Calendar.SECOND, 0); 
    ca.set(Calendar.MILLISECOND, 0); 
    Intent intent = new Intent(getBaseContext(), Receiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
      getBaseContext(), 1, intent, 0); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 
      pendingIntent); 
+0

试过这个,但它不工作! :( –

+0

我试过这个代码,它工作正常不知道为什么它不适用于你 –

+0

是否因为我已经将它添加到onCreate()方法中,因此Activity每次都会重新启动。是否可以发布整个Activity类代码在这里? –