我尝试在Activity的OnCreate状态时,初始化一个Service,然后在Service初始化很多全局参数,发现这样做是有问题的:
Activity会在OnCreateView之后被初始化,即Activity会先把控件初始化完,再真正执行startService()。我尝试用Thread.sleep睡5秒,发现上述情况。所以,要startService,必须的等View都初始化完毕,而且,Service创建的参数在这之前都不能用。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_btspp);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment(this)).commit();
}
Log.e(TAG, "Starting Service...");
//Intent intent = new Intent(this,AudioDetectService.class);
//
//startService(intent);
Log.e(TAG, "OnCreate:end sleep");
}
Activity和Fragment等函数都提供了onViewCreated()函数,意思是view已经创建完毕了,它在onCreateView()执行完后才被调用。但在这startService(),结果还是一样,startService必须要执行完onViewCreate才会启动。我把下面的UI相关的代码注释后,可以顺利通过编译,不然会先执行被注释的代码,再执行Service的onCreate。因为被注释的代码中含有Service里面设置的数据,所以导致我的代码出错。
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
Log.e(TAG_FRAG,"onViewCreate");
Log.e(TAG_FRAG, "Starting Service...");
Intent intent = new Intent(mContext,AudioDetectService.class);
mContext.startService(intent);
/*
//mBTAdp = BluetoothAdapter.getDefaultAdapter();
if(BTController.getBTAdp()==null){
Log.e(TAG_FRAG,"onCreateView getBTAdp failed");
}
mBTAddr.setText(getString(R.string.btAddr)+BTController.getBTAdp().getAddress());
// 读取蓝牙状态并显示
if (BTController.getBTAdpState() == BluetoothAdapter.STATE_OFF)
mTGBtnSwitch.setChecked(false);
else if (BTController.getBTAdpState() == BluetoothAdapter.STATE_ON)
mTGBtnSwitch.setChecked(true);*/
super.onViewCreated(view, savedInstanceState);
}
注释代码后,顺利开启Activity的log。