Intent在Service的后执行中不起作用

问题描述 投票:0回答:1

[我是Android的初学者,我的项目是将PLC与android应用程序连接,我创建了服务,在该服务中,PLC连接和从PLC获取数据都工作正常,但是数据尝试使用广播接收器传递活动,但它不起作用也没有错误,我不知道我缺少什么,可以帮助我解决这个问题。

MainActivity.java

Button btnStart, btnStop;
    TextView textViewCntReceived;
    MyMainReceiver myMainReceiver;
    Intent myIntent = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnStart = findViewById(R.id.startservice);
        btnStop = findViewById(R.id.stopservice);
        textViewCntReceived = findViewById(R.id.cntreceived);
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startService();
            }
        });
        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopService();
            }
        });
    }
    private void startService(){
        myIntent = new Intent(MainActivity.this, MyService.class);
        startService(myIntent);
    }
    private void stopService(){
        if(myIntent != null){
            stopService(myIntent);
        }
        myIntent = null;
    }
    @Override
    protected void onStart() {
        myMainReceiver = new MyMainReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(MyService.ACTION_UPDATE_CNT);
        registerReceiver(myMainReceiver, intentFilter);
        super.onStart();
    }
    @Override
    protected void onStop() {
        unregisterReceiver(myMainReceiver);
        super.onStop();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        stopService();
    }
    private class MyMainReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if(action.equals(MyService.ACTION_UPDATE_CNT)){
                int int_from_service = intent.getIntExtra(MyService.KEY_INT_FROM_SERVICE, 0);
                textViewCntReceived.setText(String.valueOf(int_from_service));
            }
        }
    }

MyService.java

final static String KEY_INT_FROM_SERVICE = "KEY_INT_FROM_SERVICE";
    final static String ACTION_UPDATE_CNT = "UPDATE_CNT";
    MyServiceThread myServiceThread;
    int ret;
    S7Client client = new S7Client();
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        Toast.makeText(getApplicationContext(),
                "onCreate", Toast.LENGTH_LONG).show();
        super.onCreate();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(getApplicationContext(),
                "onStartCommand", Toast.LENGTH_LONG).show();
        myServiceThread = new MyServiceThread();
        myServiceThread.start();
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onDestroy() {
        Toast.makeText(getApplicationContext(),
                "onDestroy", Toast.LENGTH_LONG).show();
        myServiceThread.setRunning(false);
        super.onDestroy();
    }
    private class PlcReader extends AsyncTask<String,Void,String> {
        String ret = "";
        @Override
        protected String doInBackground(String... strings) {
            try{
                client.SetConnectionType(S7.S7_BASIC);
                int res = client.ConnectTo("10.0.2.2",0,1);
                if(res == 0)
                {
                    byte[] data = new byte[4];
                    client.ReadArea(S7.S7AreaDB,1,0,2,data);
                    ret = "Values  "+ S7.GetWordAt(data,0);
                }
                else {
                    ret = "Err:"+ S7Client.ErrorText(res);
                }
                client.Disconnect();
            }
            catch (Exception e)
            {
                ret= "Exe"+e.toString();
                Thread.interrupted();
            }
            return "Executed";
        }    
        @Override
        protected void onPostExecute(String s) {    
            Toast.makeText(getApplicationContext(),ret,Toast.LENGTH_LONG).show();    
            Intent intent = new Intent();
            intent.setAction(ACTION_UPDATE_CNT);
            intent.putExtra(KEY_INT_FROM_SERVICE, ret);
            sendBroadcast(intent);
        }

    }
    private class MyServiceThread extends Thread{    
        private boolean running;    
        public void setRunning(boolean running){
            this.running = running;
        }    
        @Override
        public void run() {
            running = true;
            while (running){
                try {
                    Thread.sleep(1000);
                    new PlcReader().execute("");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

我使用线程是因为每秒从PLC获取数据并在Ui中显示

数据未传递给ui

@Override
        protected void onPostExecute(String s) {
            Toast.makeText(getApplicationContext(),ret,Toast.LENGTH_LONG).show();
            Intent intent = new Intent();
            intent.setAction(ACTION_UPDATE_CNT);
            intent.putExtra(KEY_INT_FROM_SERVICE, ret);
            sendBroadcast(intent);
        }
android service broadcastreceiver
1个回答
0
投票
不是在startActivity(intent)中而不是startService(intent)中吗?
© www.soinside.com 2019 - 2024. All rights reserved.