11

Status:---はカラクリさんとシャラド・マスケさんの回答を等しく受け入れますが、シャラド・マスケさんはバウンティ開始に回答するので、バウンティは彼に行くべきです。

パート 2 作成:パート 2 UI で起動し、スリープ モードでも動作し、電話の再起動でも起動する永続的な foreGround android サービス

では、回答は1 つstack overflowだけ受け入れられます。どちらの答えも受け入れられると思いますが、どちらかを選択する必要があります (ランダムに選択しました)。

視聴者、その努力に感謝するために、賛成/反対の回答/質問に招待されます! . 評判を補うためにカラクリの答えに賛成しました。

Scenario:---

  1. ユーザーに開始/停止ボタンをクリックさせ、UI アクティビティからサービスを開始/停止させたい。私はUIを作ったので気にしないでください。しかし、ボタンクリックイベントのロジックだけです。

  2. サービスを UI アクティビティにバインドしないでください。アクティビティが終了しても、サービスは引き続き実行されます。

  3. サービスが永続的であり、いかなる場合でも停止しないように最大限の努力をしたい. 重要度の高い階層があるため、最も重みを付けて実行します。(大丈夫だと思いますか?)ForGroundSerice

  4. アプリのUIで停止ボタンがクリックされない限り、 Androidがメモリを再利用したとしても、停止したくない(または再起動する必要がある)。私と電話のユーザーは、両方ともそれを認識しています/認識します。サービスが最も重要です。睡眠中でも。

    details= 私のアプリはいくつかの操作を行い、ユーザーが指定した時間 (通常は 15 分) スリープし、ウェイクして再度操作を実行します。これは終わらない)

    必要な場合AlarmManager、それを実装する方法は? または他の方法?それとも、操作をwhile loop and sleep for 15 minuts最後に終わりのないものにするだけですか?

  5. サービスが開始されたとき (開始ボタンをクリックして)。電話が再起動した場合に自動起動するようにエントリを作成する必要があります。

QUESTION:---

Primary Question:

  1. シナリオに最適な戦略を得ることができません...そして、どのコードをどのように使用するかという小さなコードにもこだわっています。

  2. stackoverflow.com の質問、developer.android.com、およびいくつかの Google の結果から小片を収集しましたが、統合して実装することはできません。

  3. リクエストセクションをお読みください。

Secondary Question:

私のコードのコメントは、それらの小さな質問です。

Research and Code:---

ストラテジー:

            want this to happen every time the user opens the UI.

    //Start Button:-----
    //check if ForGroundService is running or not. if not running, make var/settings/etc "serviceStatus" as false 
            <-------(how and where to stare this and below stated  boolean?)
    //start ForGroundService 
            <-------(how?)
    //make "SericeStatus" as true

    //check if "ServiceStartOnBoot" is false
    //Put ForGroundService to start on boot -------(to make it start when ever the phone reboots/restarts) 
            <-------(how?)
    //make "ServiceStartOnBoot" as true
            // the boolean can also be used to check the service status.



    //Stop Button:------
    //makes SericeStatus and ServiceStartOnBoot as false
    //stops service and deletes the on boot entry/strategy

サービスを開始/停止するアクティビティ UI クラス:

public class SettingsActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        //some button here to start / stop and their onClick Listners



    Intent mySericeIntent = new Intent(this, TheService.class);
    }


    private void startMyForGroundService(){

    startService(mySericeIntent);

    }

    private void stopMyForGroundSerice(){
        stopService(mySericeIntent);
                          /////// is this a better approach?. stopService(new Intent(this, TheService.class));          
                          /////// or making Intent mySericeIntent = new Intent(this, TheService.class);
                          /////// and making start and stop methods use the same?

                          /////// how to call stopSelf() here? or any where else? whats the best way?
    }

}

サービス クラス:

  public class TheService extends Service{

      @Override
      public IBinder onBind(Intent arg0) {
          // TODO Auto-generated method stub
          return null;
      }

      @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
          startForeground(1, new Notification());
                                  ////// will do all my stuff here on in the method onStart() or onCreat()?

          return START_STICKY;    ///// which return is better to keep the service running untill explicitly killed. contrary to system kill.
                                  ///// http://developer.android.com/reference/android/app/Service.html#START_FLAG_REDELIVERY

          //notes:-//  if you implement onStartCommand() to schedule work to be done asynchronously or in another thread, 
          //then you may want to use START_FLAG_REDELIVERY to have the system re-deliver an Intent for you so that it does not get lost if your service is killed while processing it
      }

      @Override
        public void onDestroy() {
          stop();
        }

      public void stop(){
          //if running
          // stop
          // make vars as false
          // do some stopping stuff
          stopForeground(true);
                                  /////// how to call stopSelf() here? or any where else? whats the best way?

      }


  }

メニフェスト ファイル:

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.myapp"
      android:versionCode="1"
      android:versionName="1.0" >

      <uses-sdk
          android:minSdkVersion="10"
          android:targetSdkVersion="17" />

      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <uses-permission android:name="android.permission.INTERNET" />

      <application

          android:allowBackup="true"
          android:debuggable="true"
          android:icon="@drawable/ic_launcher"
          android:label="@string/app_name"
          android:theme="@style/AppTheme" >
          <activity
          android:name="com.example.myapp.MainActivity"
          android:label="@string/app_name" >
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />

              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
          </activity>
          <activity
          android:name="com.example.myapp.SettingsActivity"
          android:label="@string/title_activity_settings" >
          </activity>

      </application>

      </manifest>

References:---

Android - サービスの startForeground を実装していますか? ポインティング回答 1、コード例。

Androidで起動時にサービスを開始しようとしています

Android:起動時にサービスを開始しますか?

http://developer.android.com/guide/components/services.html

http://developer.android.com/reference/android/app/Service.html

http://developer.android.com/training/run-background-service/create-service.html私は好まない。

http://developer.android.com/guide/components/processes-and-threads.html私の研究の出発点

Requests:---

この質問は、サービスを扱っているほとんどの人にとって普通のことだと思います。そのビジョンでは、シナリオの経験があり、完全版として最大のサンプルコードで側面と戦略を包括的に説明できる場合のみ回答してください。コミュニティにも役立ちます。

彼らの意見、時間、経験を共有し、私とコミュニティを助けてくれた私にとって重要なので、回答に(責任を持って)上下に投票してください.

4

3 に答える 3

3

質問:サービスが永続的であり、いかなる場合でも停止しないように最大限の努力をしたい. 重要度の高い階層があるため、最も重みを付けて ForGroundSerice として実行します。(大丈夫だと思いますか?)

回答:START_STICKY Intent フラグを使用してサービスを開始する必要があります。

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}

Que:AlarmManager が必要な場合、どのように実装すればよいですか? または他の方法?それとも、操作を終わりのない while ループに入れて、最後に 15 分間スリープするだけですか?

回答: 特定のタスクを実行した後は、 alarmmanager をサービス内に登録する必要があります。// サービス内にアラームマネージャを登録します。

PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new         Intent("com.xxxxx.tq.TQServiceManager"), PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000 , 30 * 1000 , pendingIntent);

//これで、このインテントを受信するブロードキャストレシーバーができました。

class Alarmreceiver extends Broadcastreceiver
{
   //u can to task in onreceive method of receiver.
}

// アラーム レシーバ アクション用に、このクラスをマニフェストに登録します。

Que:サービスが開始されたとき (開始ボタンをクリックして)。電話が再起動した場合に自動起動するようにエントリを作成する必要があります。

回答:ブロードキャスト レシーバーを使用して、オンブート完了インテントをリッスンします。

public class StartAtBootServiceReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        try {           
            if( "android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {                

                ComponentName comp = new ComponentName(context.getPackageName(), LicensingService.class.getName());
                ComponentName service = context.startService(new Intent().setComponent(comp));
                if (null == service){
                    // something really wrong here
                    //Log.Write("Could not start service " + comp.toString(),Log._LogLevel.NORAML);
                }
            }
            else {
                //Log.Write("Received unexpected intent " + intent.toString(),Log._LogLevel.NORAML);   
            }
        } catch (Exception e) {
            //Log.Write("Unexpected error occured in Licensing Server:" + e.toString(),Log._LogLevel.NORAML);
        }
    }
}

// manifest.xml ファイルで Action_BOOTCOMPLETED インテントのためにこのレシーバーを登録する必要があります

于 2013-06-15T11:49:49.837 に答える
2

でサービスを開始するとstartService()、Activity が終了してもサービスは実行され続けます。stopService()を呼び出したとき、または呼び出したstopSelf()場合 (またはシステムがプロセスを強制終了してメモリを再利用した場合) にのみ停止します。

起動時にサービスを開始するには、サービスを開始するだけの BroadcastReceiver を作成します。

public class MyReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        Intent service = new Intent(context, MyService.class);
        context.startService(service);
    }
}

次に、これらをマニフェストに追加します。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application ... >

    <receiver android:name="MyReceiver" 
        android:enabled="false" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
</application>

最初はレシーバーが有効になっていないことに注意してください。ユーザーがサービスを開始したら、PackageManager を使用してレシーバーを有効にします。ユーザーがサービスを停止したら、PackageManager を使用してレシーバーを無効にします。アクティビティで:

PackageManager pm = getPackageManager();
ComponentName receiver = new ComponentName(this, MyReceiver.class);
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,  PackageManager.DONT_KILL_APP);

と同じ方法を使用しPackageManager.COMPONENT_ENABLED_STATE_DISABLEDて無効にします。

于 2013-06-09T03:07:25.043 に答える