android 绑定服务场景,android – ServiceConnection.onServiceConnected()在绑定到已启动的服务后从未调用过...

在游戏应用程序中,我有以下场景:

>从主游戏Activity中,玩家开始在后台运行的不同持续时间的几个游戏任务.

>玩家应该能够在单独的视图中查看正在运行的游戏任务的进度.

为此,我创建了两个Activity和一个Service,定义如下:

> Service ProgressService处理在并行线程上同时运行的多个ProgressBars.

> Activity WorkScreen2创建一个游戏任务,使用带有在Bundle中传递的任务参数的startService()启动服务.

> Activity ProgressScreen绑定到服务以获取并显示正在运行的任务的ProgressBars.

>这两个活动都在一个TabActivity的单独TabHosts下运行.

我遇到的问题是从不调用ServiceConnection.onServiceConnected()方法.我得到一个Java.lang.NullPointerException,因为我尝试调用应该在此方法中分配的Service对象的方法.见下面的代码.

我使用getApplicationContext().bindService()将Activity绑定到服务,因为TabSpec cannot bind to Services.此方法返回true.因此,绑定是成功的.

这是服务:

public class ProgressService extends Service implements GameConstants {

public static final String BROADCAST_PROGRESS = "com.mycompany.android.mygame.progressbroadcast";

private static final long UPDATE_INTERVAL = 500;

private IBinder mBinder;

private List mProgressBarList;

private List mStaffNameList;

private final class ServiceHandler extends Handler {

public ServiceHandler(Looper looper) {

super(looper);

}

@Override

public void handleMessage(Message msg) {

ProgressBar progressBar = new ProgressBar(ProgressService.this);

mProgressBarList.add(progressBar);

Bundle bundle = msg.getData();

String staffName = bundle.getString(WorkScreen2.STAFF_NAME);

mStaffNameList.add(staffName);

int taskDurationMillis = bundle.getInt(WorkScreen2.TASK_DURATION) * 1000;

progressBar.setMax(taskDurationMillis / 1000);

long startTimeMillis = SystemClock.uptimeMillis();

long elapsedTimeMillis = SystemClock.uptimeMillis()

- startTimeMillis;

Intent intent = new Intent();

intent.setAction(BROADCAST_PROGRESS);

while (elapsedTimeMillis < taskDurationMillis) {

try {

Thread.sleep(UPDATE_INTERVAL);

} catch (InterruptedException e) {

e.printStackTrace();

}

elapsedTimeMillis = SystemClock.uptimeMillis()

- startTimeMillis;

int elapsedTimeSeconds = (int) elapsedTimeMillis / 1000;

progressBar.setProgress(elapsedTimeSeconds);

sendBroadcast(intent);

}

progressBar.setVisibility(View.GONE);

mProgressBarList.remove(progressBar);

mStaffNameList.remove(staffName);

sendBroadcast(intent);

if (mProgressBarList.isEmpty()) {

stopSelf(msg.arg1);

}

}

}

@Override

public void onCreate() {

super.onCreate();

mBinder = new ProgressServiceBinder();

mProgressBarList = Collections

.synchronizedList(new ArrayList());

mStaffNameList = Collections.synchronizedList(new ArrayList());

}

/*

* Creates a thread for each game task with parameters passed in

* intent

*/

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

Toast.makeText(this, "starting service", Toast.LENGTH_LONG).show();

HandlerThread thread = new HandlerThread("ServiceStartArguments",

Process.THREAD_PRIORITY_BACKGROUND);

thread.start();

Handler serviceHandler = new ServiceHandler(thread.getLooper());

Message msg = serviceHandler.obtainMessage();

msg.arg1 = startId;

msg.setData(intent.getExtras());

serviceHandler.sendMessage(msg);

return START_STICKY;

}

@Override

public IBinder onBind(Intent intent) {

return mBinder;

}

public class ProgressServiceBinder extends Binder {

ProgressService getService() {

return ProgressService.this;

}

}

public List getProgressBarList() {

return mProgressBarList;

}

public List getStaffNameList() {

return mStaffNameList;

}

@Override

public void onDestroy() {

Toast.makeText(this, "Service done", Toast.LENGTH_SHORT).show();

}

}

这是绑定它的活动:

public class ProgressScreen extends ListActivity {

private final String TAG = "ProgressScreen";

private ProgressScreenAdapter mAdapter;

private ProgressService mProgressService;

private List mProgressBarList;

private List mStaffNameList;

@Override

public void onCreate(Bundle bundle) {

Log.i(TAG, "ProgressScreen oncreate");

super.onCreate(bundle);

setContentView(R.layout.progress_screen_layout);

IntentFilter filter = new IntentFilter();

filter.addAction(ProgressService.BROADCAST_PROGRESS);

registerReceiver(receiver, filter);

doBindService();

mAdapter = new ProgressScreenAdapter(this, mStaffNameList, mProgressBarList);

setListAdapter(mAdapter); // Returns true

/*

* This is where I get the NullPointerException

* mProgressService is null here

*/

mProgressBarList = mProgressService.getProgressBarList();

mStaffNameList = mProgressService.getStaffNameList();

}

@Override

protected void onResume() {

super.onResume();

IntentFilter filter = new IntentFilter();

filter.addAction(ProgressService.BROADCAST_PROGRESS);

registerReceiver(receiver, filter);

}

@Override

protected void onPause() {

super.onPause();

unregisterReceiver(receiver);

}

boolean doBindService() {

return getApplicationContext().bindService(new Intent(this, ProgressService.class), mConnection, Context.BIND_AUTO_CREATE);

}

void doUnbindService() {

getApplicationContext().unbindService(mConnection);

}

ServiceConnection mConnection = new ServiceConnection() {

public void onServiceConnected(ComponentName className, IBinder binder) {

mProgressService = ((ProgressService.ProgressServiceBinder) binder).getService();

Toast.makeText(ProgressScreen.this, "Connected to ProgressService", Toast.LENGTH_SHORT).show();

}

public void onServiceDisconnected(ComponentName name) {

mProgressService = null;

}

};

private BroadcastReceiver receiver = new BroadcastReceiver () {

@Override

public void onReceive(Context context, Intent intent) {

mAdapter.notifyDataSetChanged();

}

};

}

服务从主要活动开始如下:

Intent intent = new Intent(WorkScreen2.this, ProgressService.class);

intent.putExtra(TASK_DURATION, task.getDuration());

intent.putExtra(STAFF_NAME, staff.getName());

startService(intent);

AndroidManifest.xml包含

android:name=".ProgressService"

android:label="@string/progress_service">

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值