0

サービスを開始するAndroidアプリケーションを開発しています。サービスは一定の時間間隔ごとにコードを実行し、アクティビティの結果を終了します。アクティビティはユーザーに結果を表示する必要があります。

まずはスレッドで試してみました。一定の間隔の後にサービスを実行するには、スレッドを作成します-コードを実行し、結果を取得します-この結果をアクティビティに送信して表示します-一定の時間間隔でスレッドをスリープ状態にします。しかし、期待どおりに機能していません。コードはスレッドによって実行されます。スレッドはスリープ状態になり、スリープ時間間隔の後、最後に結果がアクティビティに送信されます。要件は、スレッドコードの実行によって結果が取得された直後にUIを更新する必要があることです。

また、TimerとTimerTaskを使用してみました。ただし、上記と同じ結果が得られます。これについて私を助けてください。

サービスクラス

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    td = new ThreadDemo();
    td.start();
}
private class ThreadDemo extends Thread  
{
    @Override
        public void run()
        {
            super.run();
            String result = //code executes here and returns a result
            sendMessageToUI(result);  //method that will send result to Activity
            ThreadDemo.sleep(5000);
        }
}

private void sendMessageToUI(String strMessage)
{
    Bundle b = new Bundle();
    b.putString(“msg”, strMessage);
    Message msg = Message.obtain(null, 13);
    msg.setData(b);
}

アクティビティクラス

public class MyActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }
    class IncomingHandler extends Handler 
    {
        @Override
        public void handleMessage(Message msg)
        {
            System.out.println("in ui got a msg................");
            switch (msg.what)
            {
                case 13:
                    System.out.println("setting status msg..............");
                    String str1 = msg.getData().getString("msg");
                    textview.setText(str1);
                    break;      
            }
        }
    }
}
4

3 に答える 3

0

LocalBroadcastManager を使用します。サービスがローカル ブロードキャストを作成し、アプリケーションで利用できるようになります。アプリケーションでその通知の適切なハンドラーを記述し、それに応じてユーザー インターフェイスを更新できます。

次のコードをサービスに入れます

Intent i = new Intent("NotificationServiceUpdate");
        LocalBroadcastManager.getInstance(this).sendBroadcast(i);

アプリケーションで、更新するアクティビティに次を入れます

     LocalBroadcastManager.getInstance(this).registerReceiver(
                mMessageReceiver, new IntentFilter("NotificationServiceUpdate"));

これで、サービスがタスクの完了をブロードキャストするたびに、アクティビティに通知が届きます。さらに、このブロードキャストをアプリケーション専用にすることができます。

于 2012-10-16T13:01:16.753 に答える
0

ここで、ScheduledExecutor に関する私の回答を参照してください。

Androidでバックグラウンドで毎秒コードのセクションを呼び出す方法

現在行っているのと同じように、UI へのメッセージを使用します。

于 2012-10-16T13:18:07.703 に答える
0

あなたの場合、ブロードキャストレシーバーを使用する方がはるかに優れています。

アクティビティに登録し、実行ターゲットからブロードキャストを送信します

于 2012-10-16T12:56:46.400 に答える