开始服务和片段生命周期

时间:2015-03-15 16:18:02

标签: android android-fragments android-activity android-service

这是我对这一天的第二个疑问 - .- 我有一个问题。 我有一个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内部服务的消息,而不是每个片段中的消息。我错了吗?

enter image description here

编辑:也许用更好的英语我要做的是:从片段调用服务内部的函数,通过mainactivity中实现的函数interfaceinthefragment.startSearch()。然后服务执行一些操作,并通过消息将结果提供给mainactivity。此活动检查函数someF(msg)中的结果消息,并在片段内执行一些函数。

2 个答案:

答案 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)检查结果消息,并根据结果调用片段内的正确方法并执行一些操作。

我希望你能帮助我理解我能做些什么:)