Status:---
私はカラクリさんとシャラド・マスケさんの回答を等しく受け入れますが、シャラド・マスケさんはバウンティ開始後に回答するので、バウンティは彼に行くべきです。
パート 2 作成:パート 2 UI で起動し、スリープ モードでも動作し、電話の再起動でも起動する永続的な foreGround android サービス
では、回答は1 つstack overflow
だけ受け入れられます。どちらの答えも受け入れられると思いますが、どちらかを選択する必要があります (ランダムに選択しました)。
視聴者は、その努力に感謝するために、賛成/反対の回答/質問に招待されます! . 評判を補うためにカラクリの答えに賛成しました。
Scenario:---
ユーザーに開始/停止ボタンをクリックさせ、UI アクティビティからサービスを開始/停止させたい。私はUIを作ったので気にしないでください。しかし、ボタンクリックイベントのロジックだけです。
サービスを UI アクティビティにバインドしないでください。アクティビティが終了しても、サービスは引き続き実行されます。
サービスが永続的であり、いかなる場合でも停止しないように最大限の努力をしたい. 重要度の高い階層があるため、最も重みを付けて実行します。(大丈夫だと思いますか?)
ForGroundSerice
アプリのUIで停止ボタンがクリックされない限り、 Androidがメモリを再利用したとしても、停止したくない(または再起動する必要がある)。私と電話のユーザーは、両方ともそれを認識しています/認識します。サービスが最も重要です。睡眠中でも。
details= 私のアプリはいくつかの操作を行い、ユーザーが指定した時間 (通常は 15 分) スリープし、ウェイクして再度操作を実行します。これは終わらない)
必要な場合
AlarmManager
、それを実装する方法は? または他の方法?それとも、操作をwhile loop and sleep for 15 minuts
最後に終わりのないものにするだけですか?サービスが開始されたとき (開始ボタンをクリックして)。電話が再起動した場合に自動起動するようにエントリを作成する必要があります。
QUESTION:---
Primary Question:
シナリオに最適な戦略を得ることができません...そして、どのコードをどのように使用するかという小さなコードにもこだわっています。
stackoverflow.com の質問、developer.android.com、およびいくつかの Google の結果から小片を収集しましたが、統合して実装することはできません。
リクエストセクションをお読みください。
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、コード例。
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:---
この質問は、サービスを扱っているほとんどの人にとって普通のことだと思います。そのビジョンでは、シナリオの経験があり、完全版として最大のサンプルコードで側面と戦略を包括的に説明できる場合のみ回答してください。コミュニティにも役立ちます。
彼らの意見、時間、経験を共有し、私とコミュニティを助けてくれた私にとって重要なので、回答に(責任を持って)上下に投票してください.