2016-06-13 7 views
0

私はled電球(Mi-Light、limitlessLedなど)を制御するアプリを構築しています。このアプリの目的は、ユーザーが不定期に選択して実行できるようにすることです。たとえば、「キャンドルライト」エフェクトでは、ユーザーが停止を決定するまで、黄色と赤の色合いの間で電球色が多かれ少なかれランダムに変わることがあります。Android:ワクロックを使用していてもデバイスがスリープしてから数分後にバックグラウンドプロセスが停止する

クイックバックグラウンド情報:これらの電球の制御方法は、WiFiネットワーク経由で送信されるUDPパッケージによるものです。したがって、デバイスがスリープ状態であっても、このようなUDPパッケージを送信し続ける必要があります。

少し調べたところ、睡眠中でもデバイスがWiFiネットワーク経由でUDPパッケージをブロードキャストできるようにするために、ウェークロックを使用しました(見つけられなかった方が良い場合に教えてくださいアウトについて)。

デバイスは一見、ある種のディープスリープモードに入り、ネットワーク経由でパッケージを送信するのを止めるまで、何分か(おそらく10分)は正常に動作します。

これを防ぐにはどうすればよいですか?そして、より一般的に言えば、上記のことを達成するために取るべき良いアプローチは何ですか?

ただ、参考のために、ここではわずか7色の配列を回転するコードのサンプル抜粋です:

[...] 

    private static boolean animationRunning = false; 
    private Timer timer = new Timer(); 
    private PowerManager mgr = (PowerManager)getReactApplicationContext().getSystemService(Context.POWER_SERVICE); 
    private PowerManager.WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock"); 

[...] 

public void startAnimation(final int step) { 

animationRunning = true; 
wakeLock.acquire(); 

final int[] steps = { 0, 66, 99, 122, 166, 199, 255 }; 

resetTimer(); 
timer.scheduleAtFixedRate(new TimerTask(){ 
    int curstep = 0; 
    @Override 
    public void run(){ 
    byte[] Bytes = {64, (byte)steps[curstep], 85}; 
    try {sendUdp(Bytes);} catch(IOException e) {}; 
    curstep = curstep + 1; 

    if(curstep == steps.length) { 
     curstep = 1; 
    } 
    } 
},0,1000); 
} 
+1

あなたは右のAndroidサービスでこのコードを追加していますか? –

+1

Xiaomiデバイスで何かテストをしていますか? MIUIは何があってもバックグラウンドプロセスを殺す傾向があります。 – earthw0rmjim

+0

@ArpitRatanが言ったことを拡張すると、サービスでこれが必要になります。バックグラウンドで無期限に実行したい場合は、通知を必要とするか、Androidはgc'edと仮定します。 – zgc7009

答えて

1

私はhere

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

     Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); 

     _acquireWakelock(); 

     _showNotification(); 

     [do your thing] 

     return START_REDELIVER_INTENT; 
} 

private void _showNotification() { 
    Intent notificationIntent = new Intent(this, MainActivity.class); 
    notificationIntent.setAction("com.lightcontrollerrn2.action.main"); 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
      | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
      notificationIntent, 0); 

    Bitmap icon = BitmapFactory.decodeResource(getResources(), 
      R.mipmap.ic_launcher); 

    Notification notification = new NotificationCompat.Builder(this) 
      .setContentTitle("Light Controller") 
      .setTicker("Light Controller") 
      .setContentText("Light effects are running") 
      .setSmallIcon(R.mipmap.ic_launcher) 
      .setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false)) 
      .setContentIntent(pendingIntent) 
      .setOngoing(true) 
      .build(); 

    startForeground(1337, 
      notification); 
} 

に私も他の人を助けるかもしれない道に沿って見つけたカップルの事説明したように、フォアグラウンドサービス(startForegroundを())を実装することになった:

  1. フォアグラウンドサービスは、デバイスがアイドル状態のときに実行を継続するためにはまだウォークロックが必要です。

  2. さらに、Android 6.0で導入された新しいDozeモード(https://developer.android.com/training/monitoring-device-state/doze-standby.html)も同様の問題に遭遇する可能性があります。しかし、私の場合は、デバイスがドーズモードに入るのを待たずに、サービスが十分に長く実行されているように見えます(私は約1時間テストしましたが、満足しています)。 EDIT:完成のために、私もこの問題に取り組んだ。ここでは、(サービス自体の中に)それを行う方法は次のとおりです。

    @Override 
    public void onCreate() { 
        super.onCreate(); 
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
        String packageName = getPackageName(); 
        if (Build.VERSION.SDK_INT >= 23 && !pm.isIgnoringBatteryOptimizations(packageName)) { 
         Intent intent = new Intent(); 
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); 
         intent.setData(Uri.parse("package:" + packageName)); 
         startActivity(intent); 
        } 
    } 
    
+0

いいえ、フォアグラウンドサービスはAndroidでより良いソリューションになります。しかし、iOSでは、音楽プレーヤーを偽装するだけで、あなたのアプリが殺されることなくバックグラウンドで動作するようにする唯一の方法と思われます。 友好的なリマインダー:私はまだ投票を見たことがありません:) –

0

はあなたの条件を達成するために私は考えることができる2つの方法があります。

  1. あなたがフォアグラウンドであなたのアプリを保つことができる場合は、(詳細は、https://developer.android.com/training/scheduling/wakelock.htmlを参照してください)あなたの活動にandroid:keepScreenOn="true"を追加することにより、スリープ状態になるからデバイスを防ぐことができます。

  2. 第2の方法は、アプリがバックグラウンドで音楽を再生していることを偽っているため、OSによって強制終了されません。あなたはあなたのアプリの中にローカルに格納されている無音のmp3を再生し、無制限の時間だけそれを繰り返すことができます。 OSがバッテリーを使い果たすまで、あなたのアプリを殺すことはありません:)

希望すると助かります。

関連する問題