2016-11-19 29 views
-1

我正在创建我的第一个Android通知应用程序,所以我非常喜欢初学者。我有一个类Notification.java,询问用户的时间和日期。使用这些数据,它会创建一个在指定日期和时间触发的警报。 这里是我的Notification.java将报警创建代码封装在与活动不同的课程中

public class Notification extends Activity { 

private PendingIntent pendingIntent; 
private SetAlarm alarm; 
private Date date; 
private Time time; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_alarm); 

    findViewById(R.id.setTime).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      setAlarmTime(); 
     } 
    }); 

    findViewById(R.id.setDate).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      setAlarmDate(); 
     } 
    }); 

    findViewById(R.id.checkBox).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      createAlarm(); 
     } 
    }); 
} 

private void setAlarmTime() { 

} 

private void setAlarmDate() { 

} 

private void createAlarm() { 
    alarm = new SetAlarm(); 
} 

}

的createAlarm()方法被认为实际上创建使用该用户已经提供了(即时间和日期)的信息的报警代码。但是,我知道我需要以下代码块来创建闹钟?

private void setTheAlarm() { 
    Intent alarmIntent = new Intent(SetAlarm.this, AlarmReceiver.class); 
    pendingIntent = PendingIntent.getBroadcast(SetAlarm.this, 0, alarmIntent, 0); 

    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    int interval; 

    /* Set the alarm to the date specified by user */ 


    /* Repeating on every x minutes interval */ 
} 

但是,Notification.java是我扩展'活动'的地方。这也是我拥有'pendingIntent;码。

所以基本上,我怎么可以移动报警创建代码到一个单独的类时处理活动的代码是在一个完全不同的类?

感谢您的帮助。我希望我的问题很清楚。

+0

为什么对这个问题反对票,没有任何观察应该改进什么? – ivanleoncz

+0

不要想,这里发生在80%,没有解释,没有评论... – Opiatefuchs

回答

1

并不很清楚,如果这是你想要的,但如果我理解你正确,你需要的alarmManager一个额外的类里面来自世界各地的达到了吗?你可以做一个静态这样的:

public class MyAlarmManager{ 

private static AlarmManager mAlarmManager; 
private static PendingIntent mPendingIntent; 

//start alarm 
public static void setAlarm(Context context, int alarmId, long alarmTime) { 

    if (mAlarmManager== null) { 
    mAlarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    } 

Intent startAlarmIntent = new Intent(context, YouReceiver.class); 

    if(mPendingIntent==null){ 

    mPendingIntent = PendingIntent.getBroadcast(context, alarmId, 
startAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    } 

//check the version because of doze mode since MM 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
        mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, 
alarmTime, mPendingIntent); 

    } else { 
mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, alarmTime, mPendingIntent); 

    } 

} 

//stop alarm 
public static void stopAlarm(Context context, int id) { 

if (mAlarmManager == null) { 
    mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    } 

    Intent stopAlarmIntent = new Intent(context, YourReceiver.class); 

    if(mPendingIntent==null){ 
    mPendingIntent= PendingIntent.getBroadcast(context, id, stopAlarmIntent, 0); 
    } 

    mAlarmManager.cancel(mPendingIntent); 
    mPendingIntent.cancel(); 

    } 
} 

然后,你可以这样调用它:

MyAlarmManager.setAlarm(this, id, interval); 

,并阻止它:通过传递

MyAlarmManager.stopAlarm(this, id); 

您可以从每一个类来完成此context和相同的id。警报ID必须与您通过启动警报相同,否则无法使用。注意,在MarshMallow之上,AlarmManager有一些变化,它可能在任何情况下都不起作用。如果您的应用程序死亡或进入闲置模式,则在任何情况下都不会触发警报。为了处理休眠模式,看到这一点:https://developer.android.com/training/monitoring-device-state/doze-standby.html

并且要注意任何第三方应用程序和电池管理器,这可能会杀死你的应用程序。另外,除了打盹模式外,华为设备还有自己的电池管理。

如果这不是你想要的东西,回来。不能保证没有错误,因为我监督了一些事情,这是从头开始的。