为什么Activity在启动服务后会死亡?

时间:2015-08-06 08:49:49

标签: android android-activity android-lifecycle

我想知道为什么会这样。我的MainActivity启动一个服务并将自己传递给服务,因此服务可以使用它获得的数据调用MainActivity的一个方法(我完全清楚这不是应该做的事情)。但是,调用此方法时,活动中的每个字段都为空,并且尝试调用findViewById()会导致Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference

这意味着活动死了,但是怎么来的?活动的生命周期尚未结束。垃圾收集器为什么要把它带走?

请看一下代码:

MainActivity

public class MainActivity extends Activity implements Serializable{

    private RecyclerView mRecyclerView;
    private MyAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this, Servicio.class);
        intent.putExtra("ACTIVITY", this);
        startService(intent);
    }

    public void loadList(List<Data>){
        mList = (LinkedList<Data> dataList;

        mRecyclerView = (RecyclerView) this.findViewById(R.id.rv);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        mAdapter = new MyAdapter(this, mList);
        mRecyclerView.setAdapter(mAdapter);
    }
}

服务

public class MyService extends Service {

    private Thread mThread;
    private Activity mActivity;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mThread = new Thread(new Runnable() {
            @Override
            public void run() {
                execute();
            }
        });
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
        mActivity = (Activity) intent.getSerializableExtra("ACTIVITY");
        mThread.start();
        return super.onStartCommand(intent, flags, startId);
    }

    public void execute(){
        dataObtained = doStuff();
        ((MainActivity) mActivity).loadList(dataObtained);
    }
}

但是,如果我在服务中使用sendBroadcast()发送回数据并通过在其中注册BroadcastReceiver在活动中检索数据,则活动仍然完全正常运行,我可以调用findViewById()。怎么样?生命周期何时结束,但不是在这种情况下?

3 个答案:

答案 0 :(得分:1)

你这样做是错误的mActivity = (Activity) intent.getSerializableExtra("ACTIVITY");它有效吗?

您可以使用LocalBroadcastManagerOtto进行Service&amp ;;之间的通信活性

答案 1 :(得分:0)

您可以使用广播与消息处理程序进行通信,但不能使用广播。这只是一种不好的做法(因此没有“满足你的好”答案)。更不用说使用这种技术的成功将为整个Android带来的安全问题(我在这里说的是,这很可能是不可能的)。

你应该重新考虑过于热衷于维护活动的序列化,因为如果它很容易就不会出现在StackOverflow上,加上没有优秀的程序员可以真正帮助你,因为没有优秀的程序员可以做到这一点。

答案 2 :(得分:-2)

好的,我解决了。碰巧的是,在序列化对象时,您不会在接收活动中获得相同的对象。 thismActivity个对象都有不同的ID。