2015-03-30 93 views
3

我正在使用TimePicker从用户获取特定时间。然后我每天都在用这个时间来设置一个重复的闹钟。当警报关闭时,我想要通知发送给用户。我的代码似乎是正确的,我没有得到任何错误在android工作室,但是当我运行这个应用程序,并在特定的时间设置它......它永远不会关闭。请帮忙。此外,我一直无法找到任何能够显示如何使用TimePicker获取AM或PM用户选择的内容。我的代码如下。提前致谢。使用AlarmManager设置重复通知 - Android

这里是MyActivity(即经推出打开了一个)

public class MyActivity extends Activity { 

TimePicker mTimePicker; 
Button setAlarm; 
private int hour; 
private int minute; 
PendingIntent mPendingIntent; 
int AM_PM; 

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



    setAlarm = (Button) findViewById(R.id.setUpAlarm); 


    mTimePicker = (TimePicker) findViewById(R.id.timePicker); 

    setAlarm.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      setAlarm(); 



     } 
    }); 



} 

private void setAlarm() { 
    hour = mTimePicker.getCurrentHour(); 
    minute = mTimePicker.getCurrentMinute(); 

    Intent intent = new Intent(this, NotifyService.class); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    mPendingIntent = PendingIntent.getService(this, 0, intent, 0); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.SECOND , 0); 
    calendar.set(Calendar.MINUTE , 0 + minute); 
    calendar.set(Calendar.HOUR , 0 + hour); 
    calendar.set(Calendar.AM_PM , Calendar.PM); 


    Toast.makeText(this, calendar.get(Calendar.MINUTE) + " " + calendar.get(Calendar.HOUR), Toast.LENGTH_SHORT).show(); 

    // * 60 * 60 * 24 

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP , calendar.getTimeInMillis() , 1000 * 60 * 60 * 24 , mPendingIntent); 

    // Toast.makeText(MyActivity.this , "Alarm Set" , Toast.LENGTH_SHORT).show(); 
} 

这里是我的通知类

public class NotifyService extends Service { 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onCreate() { 

    Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 

    NotificationManager mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    Intent intent = new Intent(this.getApplicationContext() , MyActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 , intent ,0); 

    Notification mNotify = new Notification.Builder(this) 
      .setContentTitle("Come Back!") 
      .setContentText("Have you seen todays tip?") 
      .setSmallIcon(R.drawable.ic_launcher) 
      .setContentIntent(pendingIntent) 
      .setSound(sound) 
      .build(); 

    mNM.notify(1 , mNotify); 

} 

}

我的清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.androidy.notificationapp" > 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MyActivity" 
     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> 

回答

3

您必须在清单中声明您的服务,否则无法启动。

另外getCurrentHour()总是以24h格式返回小时,不需要知道用户是在AM还是PM中输入的。

http://developer.android.com/reference/android/widget/TimePicker.html#setCurrentHour(java.lang.Integer)

您也可能要考虑将所有的工作从的onCreate()来onStartCommand()的服务,因为的onCreate()才会被调用,如果你的服务不存在,它可能,因为你似乎没有阻止它(你也可能会考虑这么做)。

http://developer.android.com/guide/components/services.html

+0

,我会宣布我的服务我的表现像<服务机器人:启用=“真正的”机器人:名字=“NotifyService。” /> @ci_ – 2015-03-30 22:06:41

+0

,并会我回来,如果我动了我的服务是什么onStartComand? – 2015-03-30 22:07:38

+0

您可以返回此处定义的常量之一http://developer.android.com/reference/android/app/Service.html#onStartCommand(android.content.Intent,int,int),或者将默认值返回到super的调用。如果您按照答案中的链接,它还会显示如何在清单中声明服务。 – 2015-03-30 22:13:31