0

ユーザーが最近の画面からアプリをクリアした場合でも、開始後にサービスがバックグラウンドで実行され続けるようにする方法はありますか? 完璧な例は Pandora のアプリです。再生を開始すると、最近の履歴から削除しても、音楽は再生され続け、通知は残ります。

私のサンプル アプリでは、サービスが実行されているかどうかを確認できるように現在の時刻を 500 ミリ秒ごとに記録する単純なハンドラーを用意しています。4 つのトグルのいずれかを使用して開始し、それぞれが 4 つのサービスのいずれかで開始するように設定します。開始タイプ (START_STICKY、START_NOT_STICKY、START_REDELIVER_INTENT、START_STICKY_COMPATIBILITY)。サービスを開始し、アプリを終了してから、最近の履歴から消去します。いずれの場合も、サービスが停止し、ループ ロギングが停止します。

MainActivity.java

public class MainActivity extends Activity {

    private Boolean recording = false;
    private Intent recordingService;

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

        recordingService = new Intent(this, RecordingService.class);

        Button START_STICKY = (Button) findViewById(R.id.START_STICKY);
        START_STICKY.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View arg0) {
                startStopRecordingService(Service.START_STICKY);
            }
        });

        Button START_NOT_STICKY = (Button) findViewById(R.id.START_NOT_STICKY);
        START_NOT_STICKY.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View arg0) {
                startStopRecordingService(Service.START_NOT_STICKY);
            }
        });

        Button START_REDELIVER_INTENT = (Button) findViewById(R.id.START_REDELIVER_INTENT);
        START_REDELIVER_INTENT.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View arg0) {
                startStopRecordingService(Service.START_REDELIVER_INTENT);
            }
        });

        Button START_STICKY_COMPATIBILITY = (Button) findViewById(R.id.START_STICKY_COMPATIBILITY);
        START_STICKY_COMPATIBILITY.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View arg0) {
                startStopRecordingService(Service.START_STICKY_COMPATIBILITY);
            }
        });
    }

    private void startStopRecordingService(int START_TYPE) {
        if (recording) {
            recordingService.removeExtra(RecordingService.START_TYPE);
            stopService(recordingService);
        } else {
            recordingService.putExtra(RecordingService.START_TYPE, START_TYPE);
            startService(recordingService);
        }

        recording = !recording;
    }
}

RecordingService.java

public class RecordingService extends Service
{
    public final static String START_TYPE = "START_TYPE";

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startID) {
        Log.i(getClass().getName(), "onStartCommand");

        int start_type = intent.getExtras().getInt(START_TYPE);
        Log.i(getClass().getName(), "START_STICKY: " + String.valueOf(start_type == Service.START_STICKY));
        Log.i(getClass().getName(), "START_NOT_STICKY: " + String.valueOf(start_type == Service.START_NOT_STICKY));
        Log.i(getClass().getName(), "START_REDELIVER_INTENT: " + String.valueOf(start_type == Service.START_REDELIVER_INTENT));
        Log.i(getClass().getName(), "START_STICKY_COMPATIBILITY: " + String.valueOf(start_type == Service.START_STICKY_COMPATIBILITY));

        logTime();

        return start_type;
    }

    @Override
    public void onDestroy() {
        Log.i(getClass().getName(), "onDestroy");
        updateDisplayTimer.removeCallbacks(updateDisplayHandler);
    }

    public void logTime() {
        Log.i(getClass().getName(), String.valueOf(System.currentTimeMillis()));
        updateDisplayTimer.postDelayed(updateDisplayHandler, LOOP_TIME);
    }

    private static final int LOOP_TIME = 500;
    private Handler updateDisplayTimer = new Handler();
    private Runnable updateDisplayHandler = new Runnable() {
        @Override
        public void run() {
            logTime();
        }
    };
}
4

1 に答える 1

3

フォアグラウンド サービスを実装してみてください。フォアグラウンド サービス

フォアグラウンド サービスは通知を表示し、停止することはありません。

このコード スニペットをサービスに実装します

Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
        System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, getText(R.string.notification_title),
        getText(R.string.notification_message), pendingIntent);
startForeground(ONGOING_NOTIFICATION_ID, notification);
于 2014-03-31T08:42:16.980 に答える