Android 绑定到启动的服务后,从未调用ServiceConnection.onServiceConnected()
在游戏应用程序中,我有以下场景:Android 绑定到启动的服务后,从未调用ServiceConnection.onServiceConnected(),android,multithreading,android-service,android-tabhost,android-progressbar,Android,Multithreading,Android Service,Android Tabhost,Android Progressbar,在游戏应用程序中,我有以下场景: 从主游戏活动,玩家开始在后台运行的几个游戏任务,持续时间各不相同 玩家应该能够在单独的视图中查看正在运行的游戏任务的进度 为此,我创建了两个活动和一个服务,定义如下: Service ProgressService处理在并行线程上同时运行的多个ProgressBars Activity WorkScreen2创建游戏任务,使用startService()启动服务,并在包中传递任务参数 Activity ProgressScreen绑定到服务以获取并显示正
- 从主游戏
,玩家开始在后台运行的几个游戏任务,持续时间各不相同活动
- 玩家应该能够在单独的
视图中查看正在运行的游戏任务的进度
为此,我创建了两个
活动
和一个服务
,定义如下:
处理在并行线程上同时运行的多个Service ProgressService
sProgressBar
创建游戏任务,使用Activity WorkScreen2
启动startService()
服务,并在
包中传递任务参数
绑定到Activity ProgressScreen
以获取并显示正在运行的任务的服务
sProgressBar
- 两个活动都在一个
的单独TabActivity
s下运行TabHost
我遇到的问题是,
ServiceConnection.onServiceConnected()
方法从未被调用。我得到了一个Java.lang.NullPointerException
,因为我试图调用服务
对象的一个方法,该方法应该在这个方法中分配。请参阅下面的代码
我使用getApplicationContext().bindService()
将活动
绑定到服务
。此方法返回true
。因此,绑定是成功的
这是
服务
:
公共类ProgressService扩展服务实现游戏常量{
公共静态最终字符串广播\u PROGRESS=“com.mycompany.android.mygame.progressbroadcast”;
私有静态最终长更新间隔=500;
私人伊宾德;
私有列表mProgressBarList;
私有列表mStaffNameList;
私有最终类ServiceHandler扩展处理程序{
公共服务处理程序(活套-活套){
超级(活套);
}
@凌驾
公共无效handleMessage(消息消息消息){
ProgressBar ProgressBar=新的ProgressBar(ProgressService.this);
mProgressBarList.add(progressBar);
Bundle=msg.getData();
String staffName=bundle.getString(WorkScreen2.STAFF\u NAME);
mStaffNameList.add(staffName);
int taskDurationMillis=bundle.getInt(WorkScreen2.TASK_DURATION)*1000;
progressBar.setMax(taskDurationMillis/1000);
long startTimeMillis=SystemClock.uptimemilis();
long elapsedTimeMillis=SystemClock.uptimeMillis()
-斯塔蒂梅米利斯;
意图=新意图();
意图.设置动作(广播进度);
而(elapsedTimeMillisintent
*/
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
Toast.makeText(这是“开始服务”,Toast.LENGTH_LONG).show();
HandlerThread线程=新的HandlerThread(“ServiceStarTargetments”,
进程。线程(优先级(后台);
thread.start();
Handler serviceHandler=新的serviceHandler(thread.getLooper());
Message msg=serviceHandler.obtainMessage();
msg.arg1=startId;
msg.setData(intent.getExtras());
sendMessage(msg);
返回开始时间;
}
@凌驾
公共IBinder onBind(意向){
返回mBinder;
}
公共类ProgressServiceBinder扩展了Binder{
ProgressService getService(){
返回ProgressService.this;
}
}
公共列表getProgressBarList(){
返回mProgressBarList;
}
公共列表getStaffNameList(){
返回mStaffNameList;
}
@凌驾
公共空间{
Toast.makeText(这是“服务完成”,Toast.LENGTH_SHORT).show();
}
}
这是绑定到它的活动
:
public class ProgressScreen扩展了ListActivity{
私有最终字符串标记=“ProgressScreen”;
私人住宅;
私人进度服务;
私有列表mProgressBarList;
私有列表mStaffNameList;
@凌驾
创建公共void(Bundle){
Log.i(标记“ProgressScreen oncreate”);
super.onCreate(bundle);
setContentView(R.layout.progress\u screen\u布局);
IntentFilter=newintentfilter();
filter.addAction(ProgressService.BROADCAST\u PROGRESS);
寄存器接收器(接收器、过滤器);
doBindService();
mAdapter=新的ProgressScreenAdapter(此,mStaffNameLis
<service
android:name=".ProgressService"
android:label="@string/progress_service">
</service>
mProgressBarList = mProgressService.getProgressBarList();
mStaffNameList = mProgressService.getStaffNameList();
private final IBinder mBinder = new ServiceBinder();
public class ServiceBinder extends Binder {
public PlayerActivity getService() {
return PlayerActivity.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}