0

これが正しい方法かどうかはわかりませんが、やりたいことを説明しようと思います。

ラベル付きのをActivity作成する があります。私がやりたいのは、 を含むサービスを作成して開始し、そのの時間を更新することです。fragmentTemporaryFragmentTimerTimerTextView

私が考えている方法は、 が開始されたときに、をからServiceに渡し、それへの参照を維持することです。TextViewActivityServiceService

もう 1 つの方法として、 をActivityのリスナーにしてからService、 のメソッドを呼び出してServiceを更新する方法がありTextViewます。

どんな考えも素晴らしいでしょうし、おそらくいくつかのオプションがあります。

前もって感謝します。

補足 申し訳ありませんが、このタイマーをバックグラウンドで実行する必要があることも指定する必要があります。そのため、アプリケーションがバックグラウンドに送信されたときにタイマーを実行し、指示したときにのみ停止する必要があります。

4

4 に答える 4

1

サービスは、このような小さなタスクには理想的ではありません。さらに、サービスはアクティビティとは独立して実行できます。また、新しいスレッドを生成したり、アプリケーションに新しいスレッドを導入するタイマーを使用したりすることは、モバイル アプリケーションの観点から考えている場合、この比較的小さな理由で理想的ではありません。

代わりHandlerにフラグメントで使用してください。

フラグメントにハンドラーを作成する

private Handler mHandler = new Handler();

定義したタスク呼び出しを実行する

mHandler.postDelayed(mUpdateTask, 1000);

また

mHandler.post(mUpdateTask);

フラグメントでタスクを定義します

private Runnable mUpdateTask = new Runnable() {
    public void run() {
        Toast.makeText(getActivity(), "hello world", Toast.LENGTH_SHORT).show();
        mHandler.postDelayed(this, 1000);
    }
};

カウントダウンのような情報ではなく、時間のような情報を表示する場合は、

mHandler.removeCallbacks(mUpdateTimeTask);

onPause()UI の更新が関係なく、バッテリーを節約するためにアクティビティが表示されない場合にタスクの実行を停止する方法 (メソッドでタスクを再度開始するonResume())

于 2012-07-11T13:08:17.690 に答える
0

スレッドを使用して、より単純なアプローチを使用します。

public class MainActivity extends Activity implements Callback {
    private static final int MSG_UPDATE = 1;
    private static final long INTERVAL = 1000; // in ms

    private final Handler handler = new Handler(this);
    private Thread worker;

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

    @Override
    public boolean handleMessage(Message msg) {
        switch (msg.what) {
            case MSG_UPDATE:
                updateView();
                return true;
        }
        return false;
    }

    private void updateView() {
        // TODO tbd
    }

    @Override
    protected void onStart() {
        super.onStart();
        // start background thread
        worker = new Thread(new Runnable() {
            public void run() {
                while (!Thread.currentThread().isInterrupted()) {
                    try {
                        Thread.sleep(INTERVAL);
                    } catch (InterruptedException e) {
                        break;
                    }
                    // send message to activity thread
                    handler.sendEmptyMessage(MSG_UPDATE);
                }
            }
        });
        worker.start();
    }

    @Override
    protected void onStop() {
        super.onStop();
        // stop background thread
        worker.interrupt();
        try {
            worker.join();
        } catch (InterruptedException e) {
        }
        worker = null;
    }
}
于 2012-07-11T12:21:58.010 に答える
0

TimerTaskこれには Class を使用できます。メソッドをオーバーライドしてからTimerTask.run()、それTimerTaskTimerクラスに追加します。

この質問もチェックしてください:タイマーとタイマータスクでタスクを制御する

于 2012-07-11T12:22:44.880 に答える
0

基本的に、タイマーの背後にあるアイデアは、最終的にアプリケーションに追跡を追加することであり、アプリケーションがフォアグラウンドになくても実行を継続する必要があります – Disco S2

このコメントに基づいて、バックグラウンドに常駐するローカル サービスを使用することをお勧めしますService#onStartstopService(..)

一方、アクティビティはそのサービスにバインドおよびバインド解除して ( bindService(..)を参照)、更新に関する通知を受け取ったり、何らかの方法でサービスと通信したりできます。

于 2012-07-11T14:19:34.160 に答える