2017-02-14 87 views
0

(我問這裏是因爲我沒有在Xamarin論壇幫助)我創建這個代碼報警:Xamarin的Android - 如何安排和報警與廣播接收器

Intent alarmIntent = new Intent(context, typeof(AlarmReceiver)); 
    notificationClickIntent = PendingIntent.GetActivity(context, 0, new Intent(), 0); 
    pendingIntent = PendingIntent.GetBroadcast(context, 0, alarmIntent, PendingIntentFlags.UpdateCurrent); 
    am = (AlarmManager)Android.App.Application.Context.GetSystemService(Context.AlarmService); 

    DateTime setTime = new DateTime(temp.Ticks + offset); //temp is the current time where seconds field = 0 
    if ((int)Build.VERSION.SdkInt >= 21) //my device enters this case 
    { 
     AlarmManager.AlarmClockInfo info = new AlarmManager.AlarmClockInfo(setTime.Ticks, notificationClickIntent); 
     am.SetAlarmClock(info, pendingIntent); 
    } 
    else { 
     am.SetExact(AlarmType.RtcWakeup, setTime.Ticks, notificationClickIntent); 
    } 

在此之前,代碼的調用,我的課可以確保這些也被執行:

ComponentName receiver = new ComponentName(context, Java.Lang.Class.FromType(typeof(AlarmReceiver))); 
     PackageManager pm = context.PackageManager; 
     pm.SetComponentEnabledSetting(receiver, ComponentEnabledState.Enabled, ComponentEnableOption.DontKillApp); 

     Intent alarmIntent = new Intent(context, typeof(AlarmReceiver)); 
     notificationClickIntent = PendingIntent.GetActivity(context, 0, new Intent(), 0); 
     pendingIntent = PendingIntent.GetBroadcast(context, 0, alarmIntent, PendingIntentFlags.UpdateCurrent); 
     am = (AlarmManager)Android.App.Application.Context.GetSystemService(Context.AlarmService); 

這裏是我的接收器:

[BroadcastReceiver (Process = ":remote")] 
    public class AlarmReceiver : BroadcastReceiver 
    { 
     public override void OnReceive(Context context, Intent intent) 
     { 
      Console.WriteLine("alarm fired"); 
      Toast.MakeText(context, "Received intent!", ToastLength.Short).Show(); 
     } 
    } 

好,所以接收器正確地被Xamarin註冊了。我知道這一點,因爲如果我將不正確的刻度值賦予AlarmClockInfo(DateTime的刻度範圍之外的值),則警報立即熄滅,並調用我的OnReceive方法。但是,當我給它一個勾號值時,比當前時間提前一分鐘,警報不會熄滅。也許時間是錯的?...似乎不是這樣,因爲我記錄了系統下一次計劃警報的時間,並且在我設定的時間內報告回來。有什麼想法嗎?

編輯:所以我已經有一個正確執行所有這些的Android應用程序。當我將它轉換爲Xamarin和C#時,它不再有效。

+0

https://github.com/commonsguy/cw-omnibus/tree/master/AlarmManager/WakeCast有一個很好的示例。 –

+0

@JonDouglas謝謝,但這是Android Java。所以我已經有一個正確執行所有這些的Android應用程序。當我將它轉換爲Xamarin和C#時,它不再有效。 – sadelbrid

+0

請將它添加到您的原始文章中。 –

回答

3

這就是我在Xamarin應用程序中創建本地通知的方式。

DateTime time = ... // whatever time 
AlarmManager manager = (AlarmManager)context.GetSystemService(Context.AlarmService); 

Java.Util.Calendar calendar = Java.Util.Calendar.Instance; 
calendar.TimeInMillis = Java.Lang.JavaSystem.CurrentTimeMillis(); 

calendar.Set(time.Year, time.Month - 1, time.Day, time.Hour, time.Minute, 0); 
manager.SetRepeating(AlarmType.RtcWakeup, calendar.TimeInMillis, 
AlarmManager.IntervalDay, pendingIntent); 

這裏是廣播接收器類:

[BroadcastReceiver] 
public class AlarmReceiver : BroadcastReceiver 
{ 

    public override void OnReceive(Context context, Intent intent) 
    { 
     NotificationManager nManager = (NotificationManager)context.GetSystemService(Context.NotificationService); 

     Intent repeatingIntent; 

     // Here I'm opening two different Activities based on condition 
     if (CommonUtils.isLoggedIn())) 
     { 
      repeatingIntent = new Intent(context, typeof(MainActivity)); 
      repeatingIntent.PutExtra(MainActivity.SELECT_TAB, 1); 
     } 
     else 
     { 
      repeatingIntent = new Intent(context, typeof(SplashActivity)); 
     } 

     repeatingIntent.SetFlags(ActivityFlags.ClearTop); 

     PendingIntent pIntent = PendingIntent.GetActivity(context, 100, repeatingIntent, PendingIntentFlags.UpdateCurrent); 

     NotificationCompat.Builder builder = new NotificationCompat.Builder(context) 
      .SetContentIntent(pIntent) 
      .SetSmallIcon(Resource.Drawable.az_logo_small) 
      .SetColor(ContextCompat.GetColor(context, Resource.Color.PrimaryColor)) 
      .SetContentTitle(CommonUtils.MAIN_TITLE) 
      .SetContentText(UIMessages.VITAL_REMINDER) 
      .SetAutoCancel(true); 

     nManager.Notify(100, builder.Build()); 
    } 
} 

,並在AndroidManifest.xml中,你需要這個權限

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> 

還需要在AndroidManifest.xml

的註冊的BroadcastReceiver
<application android:label="YourAppName" android:largeHeap="true" android:icon="@drawable/ic_launcher"> 
    <receiver android:name=".AlarmReceiver"></receiver> 
</application> 

希望它有幫助。

+0

似乎是這樣做的。文檔不太清楚發送觸發時間的值(毫秒與滴答以及基準時間)。謝謝很多 – sadelbrid

+0

是的,我記得還在掙扎。很高興我能幫上忙。 – HeisenBerg

+0

你好日曆,可以幫助我處理DateTime.Parse(「22:30」),因爲我想設置系統時間,可以在日曆上完成,如果不是,請告訴我如何處理日期時間要安排一定的時間 –

0

首先,你必須聲明<receiver android:name=".AlarmReceiver"></receiver>在您的清單內YOUT應用

,創造一個BroadcastReceiver類:

[BroadcastReceiver] 
class AlarmReceiver : BroadcastReceiver 
{ 
    public override void OnReceive(Context context, Intent intent) 
    { 
     //Miramos si la alarma debe repetirse 
     var repeat = intent.GetStringExtra("repeat"); 

     //Hacemos sonar la alarma 
     Uri notification = RingtoneManager.GetDefaultUri(RingtoneType.Alarm); 
     Ringtone r = RingtoneManager.GetRingtone(context, notification); 
     r.Play(); 

     // 
    } 

下面的代碼是啓動和取消掛起的意圖

public void SetAlarm(long miliseconds) 
     { 
      AlarmManager alarmManager = (AlarmManager)this.Activity.GetSystemService(Context.AlarmService); 
      Intent intent = new Intent(this.Activity, typeof(AlarmReceiver)); 

      intent.PutExtra("repeat", repeat); 

      PendingIntent pendingIntent = PendingIntent.GetBroadcast(this.Activity, /*id de la alarma que sea unico */0, intent, PendingIntentFlags.CancelCurrent); 

      alarmManager.Set(AlarmType.RtcWakeup, miliseconds, pendingIntent); 

      Toast toast = Toast.MakeText(this.Activity, Resource.String.set_alarm, ToastLength.Short); 

      toast.Show(); 
     } 

     public void CancelAlarm() 
     { 
      AlarmManager alarmManager = (AlarmManager)this.Activity.GetSystemService(Context.AlarmService); 
      Intent intent = new Intent(this.Activity, typeof(AlarmReceiver)); 

      PendingIntent pendingIntent = PendingIntent.GetBroadcast(this.Activity, /*a traves del anterior id ahora podemos pedir que se actualice */0, intent, PendingIntentFlags.UpdateCurrent); 

      //Con el pending intent actualizado podemos cancelarlo 
      pendingIntent.Cancel(); 
      alarmManager.Cancel(pendingIntent); 

      Toast toast = Toast.MakeText(this.Activity, Resource.String.remove_alarm, ToastLength.Short); 

      toast.Show(); 
     } 

要完成,你必須打電話給他們,例如點擊它們時

 if (alarm.Active == true) 
     { 
      alarm.Active = false; 
      alarmsFragment.CancelAlarm(); 
     } 
     else 
     { 
      alarm.Active = true; 
// the time you want in milliseconds 
     long miliseconds = Java.Lang.JavaSystem.CurrentTimeMillis() + 10000 ; 
     alarmsFragment.SetAlarm(miliseconds); 
    }