2017-10-30 17 views
0

xamarin.AndroidアプリをMvvmCrossに開発しています。私は、アプリケーションがバックグラウンドで、ユーザーがログインしているときでも、サービスを呼びたいと思っています。問題は、アプリがフォアグラウンドでもバックグラウンドでも、毎晩2時間以内にこのサービスに電話したいと思っています。AndroidサービスとMvvmCrossとのバインド

[Service] 
    public class DeviceLoginHelper : IntentService 
    { 
     protected override void OnHandleIntent(Intent intent) 
     { 
      try 
      { 
       if(intent.HasExtra("LoggedIn")) 
       { 
       } 
      } 
      catch(Exception ex) { } 
     } 
    } 

しかし、どのように、私はタイマーを実装することができます?。私はアンドロイドサービスを書かれている

Intent loggedintent = new Intent(this,typeof(DeviceLoginHelper)); 
       loggedintent.PutExtra("LoggedIn", true); 
       StartService(loggedintent); 

ログインしますかイベントを初期化してタイマーに処理する場所そしてタイマーが経過したら、私は電話する必要がありますか?

ユーザーがログアウトすると、このサービスを停止します。どこに電話をかけるのですかMvvmCross

答えて

1

私はTimerを使用しません。代わりにAlarmManagerを設定する必要があります。スタートアップコードで

[BroadcastReceiver] 
public class AlarmReceiver : BroadcastReceiver 
{ 
    private static AlarmManager alarmMgr; 
    private static PendingIntent alarmIntent; 
    public const int NOTIFICATION_ID = 1; 
    public const int IDLE_TIME_MS = 30 * 1000; // 30-seconds (update here) 
    private NotificationManager mNotificationManager; 
    Notification.Builder builder; 

    public override void OnReceive(Context context, Intent intent) 
    { 
     // Do something when alarm triggers (here I'm building notification) 
     BuildNotification(context); 

     // reschedule alarm 
     ScheduleAlarm(IDLE_TIME_MS); 
    } 

    public static Context ApplicationContext { get; set; } 
    public static void ScheduleAlarm(int milliseconds) 
    { 
     if (milliseconds == 0) return; 

     alarmMgr = (AlarmManager)ApplicationContext.GetSystemService(Context.AlarmService); 
     var intent = new Intent(ApplicationContext, typeof(AlarmReceiver)); 
     alarmIntent = PendingIntent.GetBroadcast(ApplicationContext, 0, intent, 0); 

     alarmMgr.Set(AlarmType.ElapsedRealtimeWakeup, 
      SystemClock.ElapsedRealtime() + milliseconds, alarmIntent); 
    } 

    private void BuildNotification(Context context) 
    { 
     mNotificationManager = (NotificationManager)context.GetSystemService(Context.NotificationService); 

     var contentIntent = PendingIntent.GetActivity(context, 0, new Intent(context, typeof(MainView)), 0); 
     var message = $"Time is up"; 
     var mBuilder = new Notification.Builder(context) 
      .SetAutoCancel(true) 
      .SetPriority(NotificationCompat.PriorityMax) 
      .SetDefaults(NotificationDefaults.All) 
      .SetContentTitle("Time is up") 
      .SetStyle(new Notification.BigTextStyle() 
       .BigText(message)) 
      .SetContentText(message) 
      .SetSmallIcon(Resource.Drawable.ic_launcher); 

     mBuilder.SetContentIntent(contentIntent); 
     mNotificationManager.Notify(NOTIFICATION_ID, mBuilder.Build()); 
    } 
} 

、単に呼び出す:

AlarmReceiver.ApplicationContext = context; 
AlarmReceiver.ScheduleAlarm(timeInMs); 
+0

感謝。それが私の問題を解決しました。なぜあなたはAlarmManager over Timerを好むのですか? – Annu

+0

AlarmManagerはシステムサービスであり、必要に応じてあなたのアプリを起動させます。タイマーでは、プロセスが実行されている必要があります。 – Kiliman

関連する問題