我正在尝试创建一个服务,该服务将从应用程序中的用户请求开始。 在用户选择更新间隔后,该服务将在操作系统后台运行,并将发送不相关的消息。 我已经尝试根据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();
}
}
答案 0 :(得分:1)
你的吐司没有显示,因为你没有告诉它。尝试:
public void showNotification() {
Toast.makeText(this, "Hi", 10).show();
}
对于您的服务问题,我认为您没有正确理解服务和服务的方式。活动一起工作。服务可以独立于服务运行,也可以使用其生命周期与给定活动的生命周期匹配的服务。从您的代码中,您不清楚这些模型中的哪一个。您的实施将导致服务定期唤醒,但在您的活动运行时仅。如果用户切换到另一项活动,您的服务将不再被唤醒。
如果您希望服务定期独立于活动进行唤醒,则需要在服务本身中运行计时器事件。最好还是使用闹钟唤醒你的服务:使用AlarmManager注册一个警报,它将在未来点(或定期,如果你愿意)触发一个意图,并从IntentService
扩展你的服务,覆盖{{1}并将必要的Intent Filter添加到清单中的Service条目。