2011-01-10 12 views
20

AlarmManagerに問題があります。繰り返しアラームをスケジュールするコードを設定し、アプリケーションを実行した後にアラームが正常に実行されます。ホームボタンをクリックしてもアプリケーションが一時停止しても、アラームはその間隔で実行されます。アプリケーションを閉じた後にAndroidアラームがキャンセルされる

問題は、タスクマネージャを開いて強制的にアプリケーションを閉じるとアラームが実行されなくなることです。

これは正常な動作ですか?これを回避し、アプリケーションを終了した後にアラームを作動させ続ける方法はありますか?

コードは以下のとおりです。メソッドはApplicationContextクラスのonCreate()によって呼び出されます。

private void scheduleAlarm() { 
    if (alarmScheduled == true) { return; } // we only need to schedule once. 

    int alarmInterval = Def.pref(getApplicationContext()).getInt("alarmInterval", 30); 

    final Intent intent = new Intent(getApplicationContext(), CollectorAlarmReceiver.class); 
    final PendingIntent pending = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0); 

    AlarmManager alarmMgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 

    alarmMgr.cancel(pending); // cancel others. 

    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000, 
    alarmInterval*1000, pending); 

    Def.log(TAG,"scheduleAlarm(): alarm scheduled, interval: "+alarmInterval+" seconds"); 
    alarmScheduled = true; 
} 

レシーバーコード:

public void onReceive(Context context, Intent intent) { 
    Log.i(TAG, "CollectorAlarmReceiver invoked, starting CollectorService in background"); 

    context.startService(new Intent(context, CollectorService.class)); 

    Intent collectorService = new Intent(context,CollectorService.class); 
    collectorService.putExtra("action", CollectorService.ACTION_BACKGROUND_REQUEST_MESSAGES); 

    context.sendBroadcast(collectorService); 
} 

ありがとう!

+0

レシーバコードとalarmIntervalの例を投稿できますか? – ninjasense

+0

私はReceiverのコードを掲載しました。 alarmIntervalは30秒です。 onReceiveにログがあることがわかるので、Receiverが呼び出されたときに追跡できます。そして、アプリケーションを実行している間、正常に動作し、問題は、それが閉じているときです。 –

+0

システムのデフォルトクロックにアラームクロックを設定しないのはなぜですか?その後、タスクマネージャーによってそれを殺して、あなたのアプリのように動作するかどうかを確認します。それもあなたに警戒することができない場合。私はそれがあなたのアプリのために大丈夫だと思うし、あなたは何もする必要はありません。 –

答えて

6

これは正常な動作です。使用者が自発的にアプリケーションを強制停止する場合は、停止する必要があります。それ以外の場合は、アプリケーションのようなウイルスを作成しています。

本当に必要な場合は、他のサービスが実行されているかどうかを監視し、実行中でない場合はサービスを実行する別のサービスを作成できます。しかし、これは別のアプリケーションになります(あなたが望む)ユーザーはタスクマネージャを使用してこのアプリを殺すことはありません。

個人的には、私は心配しません。ユーザーが停止した場合は、停止する必要があります。ユーザーを困らせないでください。

+18

私は、簡単な目覚まし時計のような善意でこれを行う多くのアプリがあるので、それには反対します。また、Androidはタスクキラーを介してタスクを殺すことを意図していません。 – ninjasense

+0

私の場合、Foursquareアプリを終了しても通知を受け取れるFoursquare "ping"サービスの動作を再現したいと思います。 Facebookのアプリケーションも同じですが、私はそれがC2DMを使用していると思います。 C2DMはサービスをメモリに残さずにこれを行う唯一の方法ですか? –

+0

あなたは大きなポイントを作っています。しかし、TaskKillerを使う人はどうなりますか?彼らはそうすることがアラームが消えないことを意味していることを知らない。私はむしろ、アラームが設定されていることを確認するために実際のアプリケーションを監視する2番目のアプリケーションを作成しません。何か案は? (私はその古い記事を知っています)。 – Andy

1

アプリケーションを強制終了することは、アプリケーションを閉じる正しい方法ではなく、誤った動作をする可能性があります。

このquestionも役立つことがあります。

0

私はあなたが必要とするものを正確に行うことができました。アプリケーションマネージャツールの実行中のタブでアプリケーションを停止しても、サービスは自動的に再開します。強制終了する唯一の方法は、アプリケーションマネージャのunistallオプションの横にある強制停止ボタンです。基本的には、直接サービスに電話します。ここに私のコードは次のとおりです。クライアントの活動に

public class TestService extends Service { 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(this, "Ejecutando Servicio ...", Toast.LENGTH_SHORT).show(); 
    return Service.START_NOT_STICKY;  
    } 

@Override 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(this, "Iniciando Servicio ...", Toast.LENGTH_SHORT).show(); 
} 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this, "Deteniendo Servicio ...", Toast.LENGTH_SHORT).show(); 
} 

次のコードを記述します。

  Calendar cal = Calendar.getInstance(); 
     Intent intent = new Intent(this,TestService.class); 
     PendingIntent pIntent = PendingIntent.getService(this.getApplicationContext(), 0, intent, 0); 
     alarm= (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarm.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), 3*1000, pIntent); 

とマニフェストでサービスを宣言した:

 <service 
     android:name="TestService" 
     android:icon="@drawable/ic_launcher" 
     android:label="TestService" 
     > 
    </service>   
+0

サービスは@Igorに行く方法です、私は目覚まし時計を作っているサービスについてあなたにもっと助けが必要です、私はそれを使用しましたが、うまく動作していないようです。 –

+0

これはlink1 https://github.com/huxaiphaer/DiabeticsApp/blob/master/Droid/AlarmReceiver.cs link2です。 https://github.com/huxaiphaer/DiabeticsApp/blob/master/Droid/AppStickyService.cs –

+0

このリンクはお役に立ちますか? http://www.truiton.com/2014/09/android-service-broadcastreceiver-example/ –

7

私は@GSreeが間違っていると信じています。これを達成する簡単な方法があります。カスタムアクションを使用するだけです。ここに方法は次のとおりです。次に、BroadcastReceiverを作成

public static final String MY_ACTION = "com.sample.myaction" 

public class MyAlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(MY_ACTION)) { 
      // Do something here 
     } 
    }  
} 

あなたAndroidManifestのレシーバを登録し

まず、など、カスタムアクションの名前を定義します。XMLは:

<receiver android:name="com.sample.MyAlarmReceiver"> 
    <intent-filter> 
     <action android:name="com.sample.myaction"/> 
    </intent-filter> 
</receiver> 

その後、セットアップにアラームが、以下のPendingIntentを使用します。

Intent i = new Intent(MY_ACTION); 
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0); 

あり、それを行うには他の方法でもよいが、私はこのソリューションを試してみましたが、BroadcastReceiverが呼び出されることがあってもI私のアプリをシェルから強制終了します。

このソリューションでは、サービスを作成する必要はありません。

+4

私がアプリを強制終了した後に動作しない、これを試して、私はアンドロイド4.2.1を使用しています。ホームボタンをタップしたときにのみ機能します(アプリは一時停止中です - 殺されません)。なぜどんなアイデア? –

+0

誰かがkitkatとOSプラットフォームの問題を見つけましたか?この解決策は動作しませんplzのヘルプ – KOTIOS

+0

男は任意の答え? –

1

私はこれを数回しましたが、なぜrequestCodeに0が割り当てられているのでしょうか。私はあなたのアラームにユニークな番号を与えることは、多くの助けになると思います。

1

マニフェストファイルに

<receiver android:name=".AlarmReceiver" android:process=":remote" />

を追加します。 アプリが強制終了されてもアラームは機能します。

+6

ようこそStackOverflowへ。他のいくつかのレスポンスを持つ古いスレッドに回答を追加するとき、特にそのうちの1つが受け入れられたときは、注意してください。あなたの答えが既存のものより優れている理由を説明する必要があります。 – APC

3

これは正常な動作です!あなたのアプリがonDestroy()に行くと、アラームは機能しなくなります。

+0

これはコメントとして追加することができます –

+0

私はあまり評判をコメントできません! –

+0

彼らはその理由のためにそれを行う – quemeful

関連する問題