2017-09-27 16 views
0

私のアプリはトラッカーのようです。ユーザーの場所を保存し、サーバーに送信します。 私はこのサーバーをフォアグラウンドでスティッキーにしました。 samsung s4ではすべてうまく動作しますが、huawei名誉4cのサービスは私が画面をロックするほど速く殺されます。さらに、onDestroy()のようなメソッドは呼び出されません。私が "Protected apps"にアプリを追加すると、それはもっと生きているが、ほぼ30〜45分かかる。私のサービスを生かし続ける方法はありますか?または、フォアグランドサービスなしで私の問題を解決する方法はありますか?私はこの問題についてたくさんの記事を検索しましたが、解決策を見つけられませんでした。HuaweiデバイスでAndroidフォアグラウンドサービスが終了する

は、ここであなたはまた、CPUのウェイクロックを作成する必要が私のサービス

public class LocationService extends Service { 

    private static final long TIME_BETWEEN_LOCATION_SEND_IN_MILLIS = 60 * 1000; 
    private static final long TIME_BETWEEN_LOCATION_UPDATES = 10 * 1000; 

    private List<Location> locations; 

    private int NOTIFICATION_ID = 31337; 

    private boolean isAlreadyRunning = false; 
    public boolean Continue = true; 

    private GoogleApiClient googleApiClient; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     GoogleApiClient.Builder builder = new GoogleApiClient.Builder(getApplicationContext()); 
     googleApiClient = builder 
      .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
       @Override 
       public void onConnected(@Nullable Bundle bundle) { 
        Log.wtf("lol", "connected"); 
        LocationRequest locationRequest = new LocationRequest(); 
        locationRequest.setInterval(TIME_BETWEEN_LOCATION_UPDATES); 
        locationRequest.setFastestInterval(TIME_BETWEEN_LOCATION_UPDATES); 
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

        //noinspection MissingPermission 
        LocationServices.FusedLocationApi.requestLocationUpdates(
         googleApiClient, locationRequest, new LocationListener() { 
          @Override 
          public void onLocationChanged(Location location) { 
           locations.add(location); 
          } 
         }); 
       } 

       @Override 
       public void onConnectionSuspended(int i) { 
        Log.wtf("lol", "connection suspended"); 
       } 
      }) 
      .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { 
       @Override 
       public void onConnectionFailed(
        @NonNull ConnectionResult connectionResult 
       ) { 
        Log.wtf("lol", "connection Failed"); 
       } 
      }) 
      .addApi(LocationServices.API) 
      .build(); 
     locations = new ArrayList<>(); 
    } 

    @Override 
    public void onLowMemory() { 
     super.onLowMemory(); 
     Log.wtf("lol","service onlow"); 
    } 

    @Override 
    public void onTrimMemory(int level) { 
     super.onTrimMemory(level); 
     Log.wtf("lol","service ontrim"); 
    } 

    @Override 
    public void onTaskRemoved(Intent rootIntent) { 
     super.onTaskRemoved(rootIntent); 
     Log.wtf("lol","service ontaskremoved"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.wtf("lol", "service OnStartCommand"); 
     if (!isAlreadyRunning) { 
      Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class); 
      resultIntent.setAction(Intent.ACTION_MAIN); 
      resultIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
      PendingIntent resultPendingIntent = PendingIntent.getActivity(
       this, 
       333, 
       resultIntent, 
       PendingIntent.FLAG_UPDATE_CURRENT 
      ); 


      NotificationCompat.Builder builder = 
       new NotificationCompat.Builder(this) 
        .setContentTitle("Title") 
        .setContentText("Explanation!") 
        .setSmallIcon(R.drawable.ic_notification) 
        .setContentIntent(resultPendingIntent); 
      Notification notification = builder.build(); 
      startForeground(NOTIFICATION_ID, notification); 
      googleApiClient.connect(); 
      isAlreadyRunning = true; 

      final Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        if (locations.size() > 0) { 
         sendLocationsAndClearList(); 
        } 
        if(Continue){ 
         handler.postDelayed(this,TIME_BETWEEN_LOCATION_SEND_IN_MILLIS); 
        } 
       } 
      },TIME_BETWEEN_LOCATION_SEND_IN_MILLIS); 
     } 
     return Service.START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     Log.wtf("lol", "service onDestroy"); 
     Continue = false; 
     googleApiClient.disconnect(); 
     super.onDestroy(); 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

} 

答えて

0

です。 CPUが低電力モードになり、アプリのプロセスが停止します。何らかの理由でCPUの電源が再投入されると再開することがあります。

AndroidのドキュメントにWAKE LOCKのトピックがありますか。

関連する問題