53

私は次のように定義されているサービスを持っています:

public class SleepAccelerometerService extends Service implements SensorEventListener

基本的に、私はユーザーが自分の携帯電話/デバイスをベッドに置いて寝ている間、さまざまな理由で加速度計のアクティビティを監視するアプリを作成しています。これは長期にわたるサービスであり、夜間に殺してはなりません。夜間に発生するバックグラウンドアプリと定期的なプロセスの数によっては、Androidがプロセスを強制終了し、サービスを終了することがあります。例:

10-04 03:27:41.673: INFO/ActivityManager(1269): Process com.androsz.electricsleep (pid 16223) has died.
10-04 03:27:41.681: INFO/WindowManager(1269): WIN DEATH: Window{45509f98 com.androsz.electricsleep/com.androsz.electricsleep.ui.SleepActivity paused=false}

ユーザーに「SleepActivity」またはアプリ内のその他のアクティビティをフォアグラウンドとして強制したくありません。onSensorChangedを常にインターセプトしているため、サービスを定期的に実行することはできません。

任意のヒント?ソースコードはここにあります:http ://code.google.com/p/electricsleep/

4

7 に答える 7

72

Android 2.0 以降では、startForeground()メソッドを使用して Service をフォアグラウンドで開始できます。

ドキュメントには次のように記載されています。

開始さstartForeground(int, Notification)れたサービスは、API を使用してサービスをフォアグラウンド状態にすることができます。この場合、システムはそれをユーザーが積極的に認識しているものと見なし、メモリが不足しているときに強制終了する候補ではありません。(理論的には、現在のフォアグラウンド アプリケーションからの極度のメモリ プレッシャの下でサービスが強制終了される可能性はありますが、実際にはこれは問題になりません。)

は主に、サービスを強制終了するとユーザーに混乱が生じる場合を対象としています。たとえば、音楽プレーヤー サービスを強制終了すると、音楽の再生が停止します。

NotificationOngoing セクションの通知バーに表示されるメソッドに を指定する必要があります。

于 2010-10-04T16:01:02.450 に答える
16

BIND_AUTO_CREATE を使用してサービスをアクティビティにバインドすると、アクティビティが破棄されてバインドが解除された直後に、サービスが強制終了されます。サービスの unBind メソッドをどのように実装したかに依存しませんが、それでも強制終了されます。

もう 1 つの方法は、アクティビティから startService メソッドを使用してサービスを開始することです。このように、Activity が破棄された場合でも、サービスは破棄されたり一時停止したりすることはありませんが、適切な場合は stopSelf/stopService を使用して自分で一時停止/破棄する必要があります。

于 2011-01-27T18:57:59.953 に答える
2

サービスのフットプリントを小さくしてください。これにより、Androidがアプリケーションを閉じる可能性が低くなります。殺されるのを防ぐことはできません。そうすれば、人々は永続的なスパイウェアを簡単に作成できるからです。

于 2010-10-04T15:42:17.790 に答える
2

私はアプリに取り組んでおり、on app kill によってサービスを強制終了するという問題に直面しています。Google で調べたところ、フォアグラウンドにする必要があることがわかりました。以下はコードです:

public class UpdateLocationAndPrayerTimes extends Service {

 Context context;
@Override
public void onCreate() {
    super.onCreate();
    context = this;
}

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

    StartForground();
    return START_STICKY;
}

@Override
public void onDestroy() {


    super.onDestroy();
}

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


private void StartForground() {
    LocationChangeDetector locationChangeDetector = new LocationChangeDetector(context);
    locationChangeDetector.getLatAndLong();
    Notification notification = new NotificationCompat.Builder(this)
            .setOngoing(false)
            .setSmallIcon(android.R.color.transparent)

            //.setSmallIcon(R.drawable.picture)
            .build();
    startForeground(101,  notification);

    }
}

それが役立つことを願っています!!!!

于 2016-06-24T12:40:06.063 に答える