[我是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);
}