2017-01-05 2 views
0

現在、私はデバイスの起動以来、モバイルネットワークを介して送受信される30秒ごとにそれを行うことができます。30秒ごとにモバイルデータを取得するバックグラウンドアプリ(サービス)を作成する方法。サービスは24時間365日稼働している必要があります

Timer: -

Timer mTimer = new Timer(); 
mTimer.scheduleAtFixedRate(mTimeTask, 0, AppConstants.DATA_TRACKING_PERIOD); 

private TimerTask mTimeTask = new TimerTask() { 
     @Override 
     public void run() { 
      long currentRx = TrafficStats.getMobileRxBytes(); 
      long currentTx = TrafficStats.getMobileTxBytes(); 
     } 
    } 
}; 

Service: -

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if (isInstanceCreated()) { 
     if(!mSocket.connected()){ 
      connectConnection(); 
     } 
     return START_STICKY; 
    } 
    super.onStartCommand(intent, flags, startId); 
    connectConnection(); 
    //Timer starts from here 
    mTrafficHelper.startTracking();  
    return START_STICKY; 
} 

AndroidManifest.xml: -

<!-- Access network/ Internet connection permission --> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

<service android:name=".services.MyService" 
     android:enabled="true" 
     android:exported="true" 
     android:priority="100" /> 

これは、上記の要件を実装するための正しい方法は何ですか?提案してください。

答えて

0

サービスを24時間年中無休で稼働させることは何もありません。 Androidフレームワークはいつでもリソースのためのサービスを殺すかもしれません。

さらに、最近のAndroidバージョンではDozeモードに移行します。 Dozeは、バッテリ電源を節約するためのディープスリープモードです。 30秒ごとにサービスが実行されないようにして、バッテリーの電力を節約します。

AlarmManagerとsetExactAndAllowWhileIdleを使用する方法があります。しかし、これはPlayストアアプリでは推奨されていません。ユーザーのバッテリーを消耗します。

本当にデータを頻繁に取得する必要があるのはなぜですか。あなたはエンジニアリングをしていないか、間違ったことをまったくやっていませんか?

+0

はい。あなたは100%正しいです。しかし、これは私の必要条件ではありません。これはクライアントの要求です。また、アプリは基本的に30秒ごとにモバイルデータの使用状況を追跡する必要があります。手伝ってくれてありがとう! –

+0

その後、クライアントを押し戻します。エンジニアの仕事は、顧客が実際に必要としていること、そして技術的に可能なことをアドバイスし、把握することを盲目的に行うことだけではありません。要件とコードを書くだけであれば、半分以下の仕事をしています。 –

+0

しかし、もう一度setExactAndAllowWhileIdleをチェックしても、アプリごとに許可される頻度に制限があります。Dozeでは1分に1回以上、15分に1回は許可されません。これは現代版のAndroidでは不可能です。電話機がアクティブな間に30秒ごとに取得することはできますが、これはおそらく十分です。 –

-1

あなたのアクティビティコード

AlarmManager am =(AlarmManager)getContext().getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(getContext(), ScanReceiver.class); 
    PendingIntent pi = PendingIntent.getBroadcast(getContext(), 0, i, 0); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60, pi);  

//受信機

public class Receiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //start your service 
    } 

}

と、これは

<receiver android:name=".Receiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/> 
     </intent-filter> 
</receiver> 

それは1分であなたの受信機を呼び出します追加マニフェスト24/7 whi chはデフォルトの時間です。あなたのアプリは開いているかどうかです。

+0

setRepeatingはDozeモードでは動作しません。また、バージョン19以降では、電力を節約するためにAlarmsを変更したため(タイマーが遅れて、setRepeatingで電力を節約するために)変更されたため、 –

0

私がここで見つけたもう1つの解決策があり、その100%が私の質問に答えていません。

Android-Job

のGradle:app

compile 'com.evernote:android-job:1.1.3' 

コード:

new JobRequest.Builder(SocketSyncJob.TAG) 
       .setPeriodic(JobRequest.MIN_INTERVAL, JobRequest.MIN_FLEX) 
       .setRequiresCharging(false) 
       .setRequiresDeviceIdle(true) 
       .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED) 
       .setRequirementsEnforced(false) 
       .setPersisted(true) 
       .build() 
       .schedule(); 
関連する問題