2016-09-13 3 views
0

私はX秒ごとにサーバにチェックインするアプリを書こうとしています。Java-Androidのバックグラウンドでサーバにチェックインする

私はそれを動作させることができましたが、アプリケーションが実行され、アクティブ(最小化できるかどうかわからず、明確にテストできませんでした)とデバイスがロックされていない場合に限ります。デバイスをロックしたり、他のことを行ったりしても、チェックを続行したいと思います。

私の検索では、サービスを利用すべきだと思われますが、私がしようとしているものを実装する方法を理解できませんでした。あるいはこれを行うことができる他のものがありますか?私がするために必要なもの

とやることができなかったが、このです:

  1. ユーザーは、チェックボックスをチェックします - 私のクラスのインスタンスを作成してサービスを作成し、それに
  2. をいくつかの情報を渡す
  3. サービスを開始します渡された情報を使用するサービスで
  4. 新しいスレッドでこのインスタンスのメソッドをX秒ごとに呼び出す(このメソッドはtrue/falseを返します)
  5. ∎サービスを停止してユーザに通知する
  6. ユーザがチェックボックスのチェックを外すと、サービスを停止します。

私はこれをやってみましたが、スレッドから情報を得ることができませんでした。そうする方法はありますか?

+0

まず、常勤サービスをご希望ですか、チェックボックスの直後ですか?それは自動スタートですか? – DEADMC

+0

チェックボックスをオンにした後は、ユーザーの操作がなければ起動しないでください。 – EyfI

+0

私の声明を確認してください – DEADMC

答えて

0

例えばアクティビティからサービスを開始し、アプリ

//make these 2 variables as fields in Activity for example 
    YourService yourService = null; 
//this variable can be used for checking if your activity are binded already or not 
    boolean mBounded = false; 


Intent mIntent = new Intent(this, YourService.class); 
startService(mIntent); 
bindService(mIntent, mConnection, BIND_AUTO_CREATE); 

ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceDisconnected(ComponentName name) { 
     mBounded = false; 
     yourService = null; 
    } 

    public void onServiceConnected(ComponentName name, IBinder service) { 
     mBounded = true; 
     YourService.LocalBinder mLocalBinder = (YourService.LocalBinder) service; 
     yourService= mLocalBinder.getServerInstance(); 
    } 
}; 

とそれを結合すると、あなたはそれがあなたの活動にバインドされた後にのみ活動にサービスからメソッドを使用することができますことを忘れないでください。言い換えれば、onServiceConnectedが実行された後にのみ利用可能です。 これで、お互いに通信できるサービスとアクティビティができました。 たとえば、あなたがサービスであなたのアクティビティメソッドを呼び出したい場合は、簡単なセッターとサービスに渡す必要があり

if (yourService != null) 
    yourService.test(); 

のように、活動中にあなたのサービスのいくつかのパブリックメソッドを呼び出すことができます。すべてのXのサービス要求を行うための

Intent mIntent = new Intent(this, YourService.class); 
    stopService(mIntent); 

あなたもサービスがちょっと簡単に停止する場合は

1)あなたは、サービス内の無限大別のスレッドを実行し、Xのために遅延した後、要求を行うことができます秒。

2)X秒ごとにチェックする場合は、AlarmManagerのようなものを使用できます。

3)サービス内でCountDownTimerを使用してサーバーへのリクエストを行うことも可能です。

再起動後にCheckBoxを設定してサービスを作成する場合は、そのサービスも簡単に作成できます。したがって、簡単なBroadcastReceiverを使用する必要があります。

まず、チェックボックスの設定をSharedPreferencesに保存し、必要に応じてサービスを実行してください。

public class SimpleReceiver extends WakefulBroadcastReceiver{ 

@Override 
public void onReceive(Context context, Intent intent) { 

     //run below code if you need, depends on your saved value of Checkbox in SharedPreferences 
     Intent serviceIntent = new Intent(context, YourService.class); 
     context.startService(serviceIntent); 
    } 
} 

そして、それは再起動後に自動的に実行されますを確認するためにあなたのServiceReceiverについてAndroidManifest情報に追加することを忘れてはいけない確かに。

<service 
    android:name=".package.YourService" 
    android:enabled="true" 
    android:exported="false"> </service> 

<receiver 
    android:name=".package.SimpleReceiver" 
    android:enabled="true" 
    android:exported="true"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     <action adroid:name="android.intent.action.QUICKBOOT_POWERON" /> 
    </intent-filter> 
</receiver> 
+0

申し訳ありませんが、このソリューションを実装する方法がわかりません。 私はチェックボックスをクリックしたときに呼び出されるメソッドを持つアクティビティクラスを持っています。次に、接続に関する情報と接続するメソッドを格納する別のクラスがあります。 私は、オブジェクトを作成する以外に何かをするサービスは必要ありません。新しいスレッドでメソッドを呼び出し、trueが返ってきたら停止します。 ServiceConnectionはどこに入っていますか? – EyfI

+0

ServiceConnectionは、サービスを開始する場所のActivityである必要があります。たとえば、チェックボックスのリスナにあります。 – DEADMC

+0

サービスでオブジェクトを作成する必要がある場合は、サービスのonStartCommandで行います。 – DEADMC

関連する問題