我的問題是,我如何從我的後臺運行IntentService到主活動發送字符串「消息」(RISES和DROPS)?我想在UI中顯示此消息。從IntentService發送信息到活動
我試圖使用EventBus,因爲它需要更少的代碼,理論上對用戶來說應該更簡單,但不幸的是,它嘗試在onCreate方法中註冊訂戶時崩潰了應用程序。 謝謝!
MainActivity.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
public void startService(View view) {
Intent intent = new Intent(this, MyService.class);
startService(intent);
}
// Method to stop the service
public void stopService(View view) {
stopService(new Intent(getBaseContext(), MyService.class));
System.exit(0);
}
}
MyService.java EDITED
import android.app.IntentService;
import android.app.Service;
import android.content.Intent;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;
import android.widget.Toast;
public class MyService extends IntentService {
public MyService() {
super("MyService");
}
@Override
protected void onHandleIntent(Intent intent) {
Runnable r = new Runnable() {
public void run() {
final int RECORDER_SAMPLERATE = 8000;
final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
int frequency;
AudioRecord recorder;
int numCrossing, p, numSamples;
short audioData[];
boolean recording;
int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, bufferSize);
recorder.startRecording();
recording = true;
audioData = new short[bufferSize];
int[] values;
int k = 0, t = 0;
values = new int[2];
while (recording) {
numCrossing = 0;
numSamples = 0;
recorder.read(audioData, 0, bufferSize);
int mod = (bufferSize/4) * 4;
for (p = 0; p < mod; p += 4) {
if (audioData[p] > 0 && audioData[p + 1] <= 0) numCrossing++;
if (audioData[p] < 0 && audioData[p + 1] >= 0) numCrossing++;
if (audioData[p + 1] > 0 && audioData[p + 2] <= 0) numCrossing++;
if (audioData[p + 1] < 0 && audioData[p + 2] >= 0) numCrossing++;
if (audioData[p + 2] > 0 && audioData[p + 3] <= 0) numCrossing++;
if (audioData[p + 2] < 0 && audioData[p + 3] >= 0) numCrossing++;
if (audioData[p + 3] > 0 && audioData[p + 4] <= 0) numCrossing++;
if (audioData[p + 3] < 0 && audioData[p + 4] >= 0) numCrossing++;
numSamples += 4;
}
for (p = 0; p < bufferSize; p++) {
if (audioData[p] > 0 && audioData[p + 1] <= 0) numCrossing++;
if (audioData[p] < 0 && audioData[p + 1] >= 0) numCrossing++;
numSamples++;
}
frequency = (8000/numSamples) * numCrossing;
Log.d("proov", String.valueOf(frequency));
if (frequency >= 2550 && frequency <= 2750 && (values[0] != 2)) {
values[0] = 1;
values[1] = 2;
k = 1;
}//if
if (frequency <= 3090 && frequency >= 2900 && (values[0] == 0)) {
values[0] = 2;
values[1] = 1;
k = 1;
}//if
if (frequency <= 3090 && frequency >= 2900 && (values[0] == 1)) {
t = 1;
break;
}//if
if (frequency >= 2550 && frequency <= 2750 && (values[0] == 2)) {
t = 2;
break;
}//if
if (k != 0) {
k = k + 1;
}//if
if (k == 20) {
values[0] = 0;
values[1] = 0;
}//if
}//while
if (t == 1) {
String message = "RISES";
values[0] = 0;
values[1] = 0;
}//if
if (t == 2) {
String message = "DROPS";
values[0] = 0;
values[1] = 0;
}//if
}
};
Thread t = new Thread(r);
t.start();
//return Service.START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
您正在使用IntentService錯誤。我們使用'onHandleIntent'方法來做你的後臺工作 - 你不需要產生你自己的線程。 – Blundell
我知道我做了很多錯誤的事情,但不幸的是這只是我得到它的工作方式;)當代碼在onHandleIntent中時,它沒有做任何事情。我想我不知道如何正確啓動HandleIntent。 – AlarMa
因此,用我做的代碼是不可能發送信息到主要活動? – AlarMa