即使我已经设置了变量的值,变量也将其显示为空

时间:2019-11-17 12:05:26

标签: java android sockets

我已经创建了后台服务来连接我的套接字服务器,当应用程序关闭时它会在后台运行,当用户打开应用程序MainActivity加入我的服务类,并且看起来很好时,我的服务可以更改主要活动中的片段,但是当它断开连接并想更改主要活动中的片段,然后应用崩溃

检查我的MainActivity

public class MainActivity extends AppCompatActivity {

    private clientService mclientService;
    private Intent mServiceIntent;
    private final FragmentManager fm = getFragmentManager(); 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mclientService = new clientService(this);
        mServiceIntent = new Intent(this, mclientService.getClass());
        if (!isMyServiceRunning(mclientService.getClass())) {
            startService(mServiceIntent);
        } 
    }
    public Fragment changeFragment (Fragment cls) {
        FragmentTransaction ft = this.fm.beginTransaction();
        ft.replace(R.id.bodyFrame, cls);
        ft.commit(); 
        return cls;
    }


    private boolean isMyServiceRunning(Class<?> serviceClass) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                Log.i ("isMyServiceRunning?", true+"");
                return true;
            }
        }
        Log.i ("isMyServiceRunning?", false+"");
        return false;
    }

}

和clientService:

public class clientService extends Service {

    private Socket mSocket;
    {
        try {
            IO.Options opts = new IO.Options();
            opts.query = "_d=jakistakiid";
            mSocket = IO.socket("http://10.0.2.2:3000", opts);
        } catch (URISyntaxException e) {}
    }


    public clientService(MainActivity main) {
        super();
        mainAttach(main);
    }
    public clientService() {
    }
    public MainActivity mMain;


    public void startIt(){
        Log.i("eroapp", "Service Started");
        if(mSocket != null) {
            mSocket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    Log.i("eroapp", "connected");
                }
            }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    Log.i("eroapp", "dc:"+mMain);
                   onDC();
                }
            });
            mSocket.connect();
        }

    } 

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        startIt();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Intent broadcastIntent = new Intent(this, restartReceiver.class);
        sendBroadcast(broadcastIntent);
    }

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



    // CLIENT FUNCTIONS //
    private void onDC(){
        Log.i("eroapp", "DC:"+mMain);
    }

    private void mainAttach(MainActivity m) {
        mMain = m;
        Log.i("eroapp","Main created!");
        if(!mSocket.connected()) {
            mMain.changeFragment(new offlineFragment());
        }else{
            mMain.changeFragment(new singFragment());
        }
    }

}

看起来不错,当我关闭应用程序活动时,我的服务重新启动并在后台运行,它在logcat中显示:

  

2019-11-17 02:41:22.686 17458-17458 / com.example.secmsg I / eroapp:服务已启动

     

2019-11-17 02:41:22.803 17458-17483 / com.example.secmsg I / eroapp:已连接

当我再次打开应用程序时,我的服务已经在运行,因此它只能在clientService中运行mainAttach函数,然后在主要活动中运行runFragment函数,但是效果很好,但是 当我与服务器断开连接时,它说mMain为null; <和logcat输出:

  

2019-11-17 02:41:31.654 17458-17499 / com.example.secmsg I / eroapp:dc:null

     

2019-11-17 02:41:31.654 17458-17499 / com.example.secmsg I / eroapp:DCnull

1 个答案:

答案 0 :(得分:0)

您在mclientService上创建的MainActivity与您致电clientService时由Android系统启动的startService(intent)不同。 由Android系统使用服务类的空构造函数创建和启动的所有服务,因此,将永远不会调用clientService#mainAttach请查看此answer以获取更多信息

如果您想直接与MainActivity上的服务进行交互,则可能需要将该服务绑定到您的活动。请查看有关绑定服务here的文档。

另一件事...看来您打算使用对活动的引用直接从服务控制MainActivity。请不要这样做,而应使用广播。祝你好运!