这是我对这一天的第二个疑问 - .- 我有一个问题。 我有一个mainactivity,加载一个片段和一个服务开始在mainactivity的oncreate。
在我的片段中,通过mainactivity中的一个监听器,我调用了我的服务的一个功能。
问题是:当片段调用服务功能时,服务未启动。
我该怎么办?
我的服务向mainactivity发送一条消息,该消息调用片段中的正确方法。
我没有想法解决这个问题。 。也许我太累了..
也许如果我能知道片段何时完全加载!有办法知道吗?也许如果我在片段的onStart()中调用某个函数?
这是主要活动的代码
public class ConnectionHandle extends Activity implements interfaceinthefragment
{
boolean mBound;
Service mService;
FragmentManager fragmentManager;
FragmentTransaction fragmentTransaction;
fragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.connectionhandle);
//In this point we start the service
Intent intent = new Intent(this, servicetostart.class);
startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
//We load the correct fragment
fragmenttoload = new fragmenttoload();
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragmenttoload);
fragmentTransaction.commit();
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
// TODO Auto-generated method stub
// Because we have bound to an explicit
// service that is running in our own process, we can
// cast its IBinder to a concrete class and directly access it.
mBound = true;
LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
mService.setHandler(serviceHandler);
}
@Override
public void onServiceDisconnected(ComponentName name)
{
// TODO Auto-generated method stub
mBound = false;
}
};
private Handler serviceHandler = new Handler(Looper.myLooper())
{
@Override
public void handleMessage(Message msg)
{
someF(msg);
}
};
private void someF(Message msg)
{
//In this place I set something in the fragment depending of arrives messages from the service
}
//function in the interface inside fragment
@Override
public void startSearch()
{
if(mBound)
//function in the service
}
.
现在片段代码:
// onAttach
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
try
{
discoverListener = (Listener) activity;
}
catch (ClassCastException e)
{
throw new ClassCastException(activity.toString()+" must implement Listener");
}
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
if (vwParent != null)
{
ViewGroup parent = (ViewGroup) vwParent.getParent();
if (parent != null)
parent.removeView(vwParent);
}
try
{
vwParent=inflater.inflate(R.layout.layoutx,container,false);
} catch (InflateException e) {
}
return vwParent;
}
@Override
public void onStart()
{
super.onStart();
firstScan=true;
deviceName = new ArrayList<xxx>();
adapter=new adapter.....
vwParent.findViewById(R.id.xx).setVisibility(View.INVISIBLE);
vwParent.findViewById(R.id.xx).setVisibility(View.VISIBLE);
vwParent.findViewById(R.id.xx).setVisibility(View.INVISIBLE);
//interface implemented by the mainactivity
**discoverListener.startSearch();**
ListView listView = (ListView) vwParent.findViewById(R.id.listView1);
listView.setAdapter(adapter);
listView.setOnItemClickListener(this);
}
Bold中的函数(discoverListener.startSearch();)在服务真正启动之前被调用,但它不起作用:/
我想处理来自mainactivity内部服务的消息,而不是每个片段中的消息。我错了吗?
编辑:也许用更好的英语我要做的是:从片段调用服务内部的函数,通过mainactivity中实现的函数interfaceinthefragment.startSearch()。然后服务执行一些操作,并通过消息将结果提供给mainactivity。此活动检查函数someF(msg)中的结果消息,并在片段内执行一些函数。
答案 0 :(得分:1)
如果要调用服务中的方法,请通过调用具有intent的startService()来执行此操作...然后检查服务onStartCommand()中的意图并确定要调用的方法。您可以根据需要随时调用startService。这是一个例子。
我在Application类中有这个
startService(new Intent(mContext, LocationMonitorService.class));
这在我的服务中:
public int onStartCommand(Intent intent, int flags, int startId) {
MyLog.p(this,"inside service making request for location updates");
mIntent = intent;
if (intent != null) {
if (intent.hasCategory("COM.GMAIL.NPNSTER.FIRST_PROJECT.MAP_FRAGMENT_RESUMED")) {
startRequestMarkerUpdates();
startLocationPushRequests();
} else if (intent.hasCategory("MAP_FRAGMENT_PAUSED")) {
endRequestMarkerUpdates();
endLocationPushRequests();
} else if (intent.hasCategory("LOCATION_UPDATE_REQUEST_RECEIVED")) {
deviceLocationClient.requestLLocationUpdates();
}
}
至于确保Fagment已满载,请覆盖片段onResume方法。
答案 1 :(得分:0)
在第一篇文章中,我添加了代码。 我要做的是:from fragment通过在mainactivity中实现的函数interfaceinthefragment.startSearch()调用服务内部的函数。然后在服务内部执行一些操作,并通过消息将结果提供给mainactivity。 MainActivity用函数someF(msg)检查结果消息,并根据结果调用片段内的正确方法并执行一些操作。
我希望你能帮助我理解我能做些什么:)