1

他のアクティビティやスレッドからサービスを呼び出すことができ、一部のレシーバーはサービスからのコールバックを待ちます。私は、サービスが私のアプリの1つのインスタンスにすぎないことを知っています。常にバックグラウンドでハングアップするのではなく、呼び出す必要があるときにサービスを実行したいと思います。どうすれば安全にサービスを開始/停止できますか?前もって感謝します。

4

2 に答える 2

4

IntentServiceを使用します。

それはあなたのニーズに非常によく似ています。それはあなたが望むときに始まります...そしてそれがそのタスクを自動的に完了したときに停止します。そのため、すぐにメモリを解放します。もう1つの大きな利点は、独自のスレッドで実行されるため、メインスレッド/UIが停止しないことです。

これで質問に答えられると判断した場合は、「承認済み」としてマークしてください。これにより、あなたと私の評判スコアの両方が上がります。

于 2012-08-16T05:26:43.557 に答える
2

MainPage.java

package com.pack.service_tost_handler;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;

public class MainPage extends Activity {
    static Mhandler  mhandler;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_page);
        mhandler=new Mhandler();

    }
    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        Intent i = new Intent(MainPage.this, ServicePage.class);
        Log.i("log", "i m create in main page");
        startService(i);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main_page, menu);

        return true;
    }

    class Mhandler extends Handler
    {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if(msg.what==111)
            {

                Toast.makeText(MainPage.this, "welcome to "+ msg.obj.toString(), Toast.LENGTH_SHORT).show();
            }
        }

    }
}

ServicePage.java

package com.pack.service_tost_handler;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;

public class ServicePage extends Service implements Runnable
{
    String[] ary;
    @Override
    public void onCreate() 
    {
        Log.i("log", "create");
        super.onCreate();
        ary= new String[] { "Android", "iPhone", "WindowsMobile",
                "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                "Linux", "OS/2" };
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Thread t1 = new Thread(this);
        t1.start();
        return super.onStartCommand(intent, flags, startId);
    }

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

    @Override
    public void run() {
        for(int i=0;i<ary.length;i++)
        {
            try
            {
                synchronized (this) {
                    this.wait(5000);    
                }
            }
            catch (Exception e) {
                Log.i("log", "Exception");
            }
            Message msg= MainPage.mhandler.obtainMessage(111);
            msg.obj=ary[i];
            MainPage.mhandler.sendMessage(msg);
        }
    }





}
于 2012-08-16T05:33:32.553 に答える