创建一个Android服务

时间:2011-10-19 14:48:45

标签: android

我正在尝试创建一个服务,该服务将从应用程序中的用户请求开始。 在用户选择更新间隔后,该服务将在操作系统后台运行,并将发送不相关的消息。 我已经尝试根据Service class API的示例编写服务。 出于某种原因,我在调试(运行doBindService()方法时)认为mUpdateBoundService变为null。 我的第二个问题是我是否可以在应用程序外使用“Toast”通知消息? (作为一种桌面通知)。 有人可以帮忙吗?这是我的简短代码:

UpdateService.java

package android.update;

import java.util.Timer;

import java.util.TimerTask;

import android.app.Notification;

import android.app.NotificationManager;

import android.app.PendingIntent;

import android.app.Service;

import android.content.Intent;

import android.os.Binder;

import android.os.IBinder;

import android.widget.Toast;

public class UpdateService extends Service {
    private NotificationManager mNM;

    private final IBinder mBinder = new UpdateBinder();
    private int updateInterval;    

    public class UpdateBinder extends Binder {
        UpdateService getService() {
            return UpdateService.this;
        }
    }

    public void onCreate() {
        mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        Timer timer = new Timer();
        timer.schedule(new UpdateTimeTask(), 100, updateInterval);
    }

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

    class UpdateTimeTask extends TimerTask {
           public void run() {
               showNotification();
           }
        }

    public void showNotification() {        
        Toast.makeText(this, "Hi", 10);
    }

    @Override
    public IBinder onBind(Intent intent) {
        updateInterval = intent.getExtras().getInt(getString(R.string.keyUpdateInterval));
        return mBinder;
    }
}

UpdateActivity.java

package android.update;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Bundle;

import android.os.IBinder;

import android.view.View;

import android.widget.EditText;

import android.widget.Toast;

public class UpdateActivity extends Activity {

    private UpdateService mUpdateBoundService;
    private boolean mIsBound = false;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void onClickStartUpdateService(View view) {
        switch (view.getId()) {
        case R.id.btnStartUpdateService:
            doBindService();
            //Toast.makeText(this,"Service Started",Toast.LENGTH_LONG).show();
            mUpdateBoundService.showNotification();
            break;
        }
    }    

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            mUpdateBoundService = ((UpdateService.UpdateBinder)service).getService();
        }

        public void onServiceDisconnected(ComponentName className) {
            mUpdateBoundService = null;
        }
    };

    private void doBindService() {
        Intent updateActivityIntent = new Intent(UpdateActivity.this, 
                UpdateService.class);       
        EditText txtUpdateInterval = (EditText) findViewById(R.id.txtUpdateInterval);
        int interval = Integer.parseInt(txtUpdateInterval.getText().toString());
        updateActivityIntent.putExtra(getString(R.string.keyUpdateInterval), interval);
        bindService(updateActivityIntent, mConnection, Context.BIND_AUTO_CREATE);
        mIsBound = true;
    }

    void doUnbindService() {
        if (mIsBound) {             
            unbindService(mConnection);
            mIsBound = false;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        doUnbindService();
    }
}

1 个答案:

答案 0 :(得分:1)

你的吐司没有显示,因为你没有告诉它。尝试:

public void showNotification() {        
    Toast.makeText(this, "Hi", 10).show();
}

对于您的服务问题,我认为您没有正确理解服务和服务的方式。活动一起工作。服务可以独立于服务运行,也可以使用其生命周期与给定活动的生命周期匹配的服务。从您的代码中,您不清楚这些模型中的哪一个。您的实施将导致服务定期唤醒,但在您的活动运行时。如果用户切换到另一项活动,您的服务将不再被唤醒。

如果您希望服务定期独立于活动进行唤醒,则需要在服务本身中运行计时器事件。最好还是使用闹钟唤醒你的服务:使用AlarmManager注册一个警报,它将在未来点(或定期,如果你愿意)触发一个意图,并从IntentService扩展你的服务,覆盖{{1}并将必要的Intent Filter添加到清单中的Service条目。