2016-11-01 18 views
1

私はサービスの壁紙サービス(ライブ壁紙ではない)ので、私は5つのラジオボタンがすべてのボタンは、壁紙が変更された時間を決定すると私はサービスをトリガし、私のサーバーからの応答を持っている私はアプリを閉じても....私はデバイスを再起動すると、私は1応答だけを取得し、壁紙が変更されていないと言う私はちょうど私がそれを停止し、私はちょうど私のサーバーからの1つの応答と壁紙を停止します。この応答では変わりません。もっと理解できるコードを見てください(私は受信機とブートプライムを使用しましたが...)。サービスがデバイスの再起動後に昼食を取らない...!

MainActivity;

private final static int INTERVAL = 4000; //10 min 
private final static int INTERVAL2 = 1000*60*30; // 30 min 
private final static int INTERVAL3 = 1000 * 60 * 120; // 2 hours 
private final static int INTERVAL4 = 1000 * 60 * 360; // 6 hours min 
private final static int INTERVAL5 = 1000 * 60 * 1440; // 1 day 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    rd1 = (RadioButton) findViewById(R.id.radioButton); 
    rd2 = (RadioButton) findViewById(R.id.radioButton2); 
    rd3 = (RadioButton) findViewById(R.id.radioButton3); 
    rd4 = (RadioButton) findViewById(R.id.radioButton4); 
    rd5 = (RadioButton) findViewById(R.id.radioButton5); 

    radioGroup = (RadioGroup) findViewById(R.id.radiogroup); 
    mHandler = new Handler(); 
    btn = (Button) findViewById(R.id.button); 
    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      Intent intent = new Intent(MainActivity.this , WallService.class); 
      PendingIntent pintent = PendingIntent.getService(MainActivity.this, 0, intent, 0); 
      AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
      alarm.cancel(pintent); 
      if (rd1.isChecked()) { 

       alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),INTERVAL, pintent); 
      } else if (rd2.isChecked()) { 
       alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),INTERVAL2, pintent); 
      }else if (rd3.isChecked()) { 
       alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),INTERVAL3, pintent); 
      }else if (rd4.isChecked()) { 
       alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),INTERVAL4, pintent); 
      }else if (rd5.isChecked()) { 
       alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), INTERVAL5, pintent); 
      } 
     } 
    }); 
} 

サービス

String forecastJsonStr; 

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

@Override 
public void onStart(Intent intent, int startId) { 


    final Thread thread1 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      HttpURLConnection urlConnection = null; 
      BufferedReader reader = null; 


      try { 

       URL url = new URL("yay.php"); 

       urlConnection = (HttpURLConnection) url.openConnection(); 
       urlConnection.setRequestMethod("POST"); 
       urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       urlConnection.setDoInput(true); 
       urlConnection.setDoOutput(true); 
       urlConnection.connect(); 
       DataOutputStream wr = new DataOutputStream(
         urlConnection.getOutputStream()); 
       wr.write("method=get_random_wallpaper".getBytes()); 
       wr.flush(); 
       wr.close(); 

       InputStream inputStream = urlConnection.getInputStream(); 
       StringBuffer buffer = new StringBuffer(); 
       if (inputStream == null) { 
       } 
       reader = new BufferedReader(new InputStreamReader(inputStream)); 

       String line; 
       while ((line = reader.readLine()) != null) { 

        buffer.append(line + "\n"); 
        Log.d("hey", buffer.toString()); 

       } 

       if (buffer.length() == 0) { 
       } 
       forecastJsonStr = buffer.toString(); 

      } catch (IOException e) { 
       Log.e("PlaceholderFragment", "Error ", e); 

      } finally { 
       if (urlConnection != null) { 
        urlConnection.disconnect(); 
       } 
       if (reader != null) { 
        try { 
         reader.close(); 

        } catch (final IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 

     } 

    }); 
    thread1.start(); 

    Thread thread = new Thread(new Runnable() { 

     @Override 
     public void run() { 

      WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext()); 
      try { 

       Bitmap result = Picasso.with(getBaseContext()) 
         .load(hostName + hostWallpaperName + forecastJsonStr) 
         .get(); 
       wallpaperManager.setBitmap(result); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 

     } 

    }); 
    thread.start(); 
} 



@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 

public void onReceive(Context context, Intent intent) { 
    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { 
     Intent pushIntent = new Intent(context, WallService.class); 
     context.startService(pushIntent); 

マニフェスト受信

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.mike.lol8"> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.SET_WALLPAPER" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 


<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <receiver android:name=".BootCompletedIntentReceiver" 
     android:enabled="true" 
     android:exported="true" 
     > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
    <service android:name=".WallService" 
     android:enabled="true" 
     android:exported="true"> 

    </service> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

+0

あなたがテストしているデバイスまたはエミュレータのAndroidバージョンは何ですか? – nandsito

+0

4.4.4 Kitkat ...! –

+0

私のサービスは機能していると思うが、再起動時にラジオボタンのアラームマネージャが動作していないことを確認した。 –

答えて

1

デバイスの再起動後、アラームマネージャに設定されたアラームがクリアされます。 - docs

BOOT_COMPLETED受信機でアラームマネージャを再度初期化する必要があります。あなたは、受信機にonReceiveに続いて SharedPreference preference = PreferenceManager.getDefaultSharedPreference(this); preference.edit.putInt("timeInterval",INTERVAL).apply;

を追加し、あなたのアラームアクティビティののonClickで を設定するために必要な時間を保存するためにsharedPrefferenceを使用することができます。

SharedPreference preference = 

PreferenceManager.getDefaultSharedPreference(this); 
int interval = preference.getInt("timeInterval", 4000); 
alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),interval, pintent); 
+0

私は新しいクラスの新しいレシーバーでそれをするでしょうか?またはこのレシーバにコピーしてコピーするだけですか? –

+0

私は教えてくれますか? –

+0

@ Dr.Easyは解答を編集しました - これが役に立っているかどうかを確認してください – X3Btel

0

は、受信機を作成し、マニフェストに次のように登録しますあなたのサービスを再び開始する必要がありますonReceive()あなたはあなたのサービスを再び開始する必要があります

<receiver 
     android:enabled="true" 
     android:name=".BootUpReceiver" 
     android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </receiver> 
関連する問題