web-dev-qa-db-ja.com

バックグラウンドでサービスを継続的に実行する

バックグラウンドでサービスを継続的に実行します。たとえば、アプリを閉じても20秒に1回トーストメッセージを表示するサービスを開始する必要があります。

public class AppService extends IntentService {

    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    public AppService() {
        super("AppService");
    }

    @Override
    protected void onHandleIntent(Intent workIntent) {
        Toast.makeText(getApplicationContext(), "hai", Toast.LENGTH_SHORT).show();
        SystemClock.sleep(20000);
    }
}
3
Vinoth

以下のコードは私のために働きます...

public class AppService extends Service {

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

@Override
public void onCreate() {
    Toast.makeText(this, " MyService Created ", Toast.LENGTH_LONG).show();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, " MyService Started", Toast.LENGTH_LONG).show();
    return START_STICKY;
}
}
6
Vinoth

サービスを宣言するマニフェストに、次を追加します。

Android:process=":processname"

これにより、サービスを別のプロセスで実行できるため、アプリでサービスが強制終了されることはありません。

次に、フォアグラウンドを使用するかどうかを選択できます。永続的な通知が表示されますが、サービスが強制終了される可能性は低くなります。

さらに、継続的に実行されるサービスを作成する場合は、Service[〜#〜] not [〜#〜]IntentServiceを使用します。 IntentServiceは、アクションの実行が終了すると停止します。

2
Zoe

このコードは私のために働きます。

public class ServiceClass extends Service {

    public static final int notify = 300000;  //interval between two services(Here Service run every 5 Minute)
    private Handler mHandler = new Handler();   //run on another Thread to avoid crash
    private Timer mTimer = null;    //timer handling

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        if (mTimer != null) // Cancel if already existed
            mTimer.cancel();
        else
            mTimer = new Timer();   //recreate new
        mTimer.scheduleAtFixedRate(new TimeDisplay(), 0, notify);   //Schedule task
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mTimer.cancel();    //For Cancel Timer
        Log.d("service is ","Destroyed");
    }

    //class TimeDisplay for handling task
    class TimeDisplay extends TimerTask {
        @Override
        public void run() {
            // run on another thread
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    Log.d("service is ","running");
                }
            });
        }
    }
}
1
Fra Red