2016-02-17 6 views
9

Androidで1日に1回アプリケーションを起動したときにサービスクラスを呼びたいとします。サービスクラスを呼び出すアプリケーションが1日に1回Androidで起動し、バッテリー消費量が少ない

マニフェストコード:

<service android:name=".DailyRemainder" > 
      <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </service> 

Javaコード:コードの上

// for Repeating Process 
    Intent myIntent = new  Intent(sign_in.this,.DailyRemainder.class); 
    pendingIntent1 = PendingIntent.getService(sign_in.this, 0,myIntent, 0); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.SECOND, 20); alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent1); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 24*60*60*1000, pendingIntent1); 

バックグラウンドで実行されていることは、私の携帯電話のバッテリー、 を排出するが、ユーザがアプリケーションその時間サービスを開始したときに私が必要1日にを実行する必要があります。これを達成する方法。

+0

を実行し、そこに来るアラームマネージャの一部を削除それを持つ多くの設定。必要に応じて設定することができます。 – UMESH0492

+0

これを明確にします。アプリケーションを開いたときにサービスが開始されますか?アプリケーションが終了した時点でサービスを開始しません。共有環境設定でサービスの最後の開始のタイムスタンプを保存し、アプリケーションを起動する日をチェックすることができます。あなたの場合ですか? –

+0

Job SchedulerはAPI <21では使用できません。 – Talha

答えて

3

共有プレフィックスを使用している質問の回答が見つかりました。

アクティビティの開始時に、非同期タスクが最初に実行されます。ポスト実行中の日付は保存されます。

その後、asyncは同じ日には実行されません。私はポストに

// Shared Preferences 
    SharedPreferences settingsShrepref; 

    // Editor for Shared preferences 
    SharedPreferences.Editor editor; 
    // Sharedpref file name 
    private static final String PREF_NAME = "MyPrefFileShred"; 

    // User name (make variable public to access from outside) 
    public static final String KEY_TODAY_DATE_ANDTIME = "TimeToday"; 

内のonCreate活動

/* Added Servcie count Once in a day Fetch from Server*/ 

      try { 

       DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
       Date date = new Date(); 
       TodayDate_String = dateFormat.format(date); 


       settingsShrepref = getSharedPreferences(PREF_NAME, 0); 
       editor = settingsShrepref.edit(); 

       String Val=settingsShrepref.getString(KEY_TODAY_DATE_ANDTIME,""); 


       Log.i("Stored Val", Val); 
       Log.i("Today date", TodayDate_String); 
       if(!Val.equals(TodayDate_String)) 
       { 

        //for SYNC web to Local 
        try 
        { 
         Log.d("Comments", "FirstTime Started"); 

         // get Internet status 
         isInternetPresent = cd1.isConnectingToInternet(); 

         // check for Internet status 
         if (isInternetPresent) 
         { 
          new AsyncCallWSCategoryCOUNTFetch().execute(); 

         } 
         else { 

          Log.i("CATEGORY COUNT ", "Not Internet ......!"); 
         } 
        } 
        catch (Exception e) 
        { 
         e.printStackTrace(); 
         Log.i(" CATEGORY COUNT ", "EXCEPTION in reading Data from Web Async task ONstart ......!"); 

        } 


       } 
       else 
       { 
        Log.d("Comments", "Second TIme"); 

        Getmethod(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
       Log.i("", "Exception here Run Service."); 
      } 

インサイド非同期タスクは、あなたがアンドロイドでジョブスケジューラを使用することができます

@Override 
     protected void onPostExecute(Void result) 
     { 
      Log.i(TAG_CategoryCOUNT, "onPostExecute"); 


      try { 



       //the app is being launched for first time in a Day, do something 
       Log.d("Comments", "First Time"); 

       // Storing name in pref 
       editor.putString(KEY_TODAY_DATE_ANDTIME, TodayDate_String); 
       // commit changes 
       editor.commit(); 

       String Val=settingsShrepref.getString(KEY_TODAY_DATE_ANDTIME, null); 
       Log.d("after Insertion data Date", Val); 



      } catch (Exception e) { 

       e.printStackTrace(); 
      } 

     } 
6

AlarmManagerは、デバイスを100%起動する機能のみです。

バッテリーが消耗しても、サービスはバッテリーをまったく消費しません。私はあなたのコードをもっと慎重に読まなければならないと思います。

それにもかかわらず、いくつかのアドバイス。 サービスの代わりにブロードキャストレシーバを呼び出して起床することができます。 am.setExact上記の場合

Intent intent = new Intent("yourBroadCastString"); 
PendingIntent pi = PendingIntent.getBroadcast(...); 
int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
     if (currentapiVersion >= android.os.Build.VERSION_CODES.KITKAT){ 
      am.setExact(wakeup?AlarmManager.RTC_WAKEUP:AlarmManager.RTC, nexttime, pi); 
     } else{ 
      am.set(wakeup?AlarmManager.RTC_WAKEUP:AlarmManager.RTC, nexttime, pi); 
     } 

を使用し、ある は本当にあなたが放送内で使用する必要があり、この場合にお使いのデバイスをウェイクアップするために、

をバッテリーを消費することができますandroidmanifest.xml内部

PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); 
      wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
        PowerManager.ACQUIRE_CAUSES_WAKEUP | 
        PowerManager.ON_AFTER_RELEASE, _.APPNAME + Integer.toString(index)); 
     if (wakeLock != null && wakeLock.isHeld()){ 
      wakeLock.acquire(); 
     } 

ComponentName comp = new ComponentName(ctx.getPackageName(), 
       yourServiceClass.class.getName()); 
     startWakefulService(ctx, intent.setComponent(comp)); 

<receiver android:name="yourBroadCast"> 
     <intent-filter> 
      <action android:name="yourBroadCastString"/> 
     </intent-filter> 
     </receiver> 

deは本当に悪いです:

Omg、これは何ですか? Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); long t = calendar.getTimeInMillis(); 私はあなたのコードを読む必要があると思います。

+0

私はそれのために与えられた20秒後にサービスを開始 – Kumar

+0

私は1日に1回実行することができますアプリの開始時に? – Kumar

-1

thisを使用すると、デバイスを起動したままにしたり、デバイスを起動してサービスを開始したりする場合もあります。

アプリの起動時に1日1回実行するには、SharedPreferencesを使用してタスクが完了したときに保存するだけで、ユーザーがタスクを再度開いたときにSharedPrefsの簡単なチェックでタスクが再度実行されないようにします。

関連する問題