我正在开发一个 Android Wear OS 2.0 应用程序。每次用户从给定号码收到短信时,手表都应该开始振动,并且应该出现一个带有给定文本的 UI,并带有一个停止振动的按钮。它的工作方式如下:
在SmsReciever.java
我正在检查电话号码是否匹配,或者 UI 屏幕是否已经处于活动状态。
public class SmsReceiver extends BroadcastReceiver {
//interface
private static SmsListener mListener;
@Override
public void onReceive(Context context, Intent intent) {
Bundle data = intent.getExtras();
Object[] pdus = (Object[]) data.get("pdus");
for(int i=0;i<pdus.length;i++){
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i], "3gpp");
String sender = smsMessage.getDisplayOriginatingAddress();
String alertPhoneNumber = "301112233";
if (sender.toLowerCase().contains(alertPhoneNumber.toLowerCase()))
{
String messageBody = smsMessage.getMessageBody();
//Pass the message text to interface
mListener.messageReceived(messageBody);
} else if (AlarmActivity.active) {
Intent intent1 = new Intent();
intent1.setClassName("hu.asd.watchtest", "hu.asd.watchtest.AlarmActivity");
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
}
}
}
public static void bindListener(SmsListener listener) {
mListener = listener;
}
}
我需要 else if 部分,因为有时当 UI 处于活动状态并且我收到一条新消息时,振动停止了。所以那部分开始AlarmActivity
(处理振动)。
在MainActivity.java
我绑定了一个新的监听器,所以现在每次我在 中得到正确的消息时SmsReciever
,AlarmActivity
应该运行:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestPermissions(Manifest.permission.RECEIVE_SMS, PERMISSIONS_REQUEST_RECEIVE_SMS);
SmsReceiver.bindListener(new SmsListener() {
@Override
public void messageReceived(String messageText) {
Intent myIntent = new Intent(MainActivity.this, AlarmActivity.class);
MainActivity.this.startActivity(myIntent);
}
});
}
在AlarmActivity.java
应用程序中唤醒屏幕,然后获取Vibrator
,将 onClickListeners 设置为停止振动按钮,然后开始实际振动。我还在这里更改了活动状态:
public class AlarmActivity extends WearableActivity {
static boolean active = false;
@Override
public void onResume() {
super.onResume();
active = true;
}
@Override
public void onStart() {
super.onStart();
active = true;
}
@Override
public void onStop() {
super.onStop();
active = false;
}
@Override
public void onPause() {
super.onPause();
active = false;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alarm);
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
final PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
"MyWakelockTag");
wakeLock.acquire();
findViewById(R.id.stop_button).getBackground().setLevel(5000);
final Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
final long[] mVibratePattern = new long[]{0, 400, 800, 600, 800, 800, 800, 1000};
final int[] mAmplitudes = new int[]{0, 255, 0, 255, 0, 255, 0, 255};
final Button stopButton = findViewById(R.id.stop_button);
stopButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
vibrator.cancel();
wakeLock.release();
new SendEmail().execute();
Intent myIntent = new Intent(AlarmActivity.this, MainActivity.class);
AlarmActivity.this.startActivity(myIntent);
}
});
setAmbientEnabled();
vibrator.vibrate(VibrationEffect.createWaveform(mVibratePattern, mAmplitudes, 0)); // 0 to repeat endlessly.
}
}
如果用户按下按钮,则 MainActivity 再次启动。问题是,在 50 种情况下,我可以发送多条短信,手表会一直振动,直到我按下停止按钮,但在 1 种情况下,它只会振动一次,然后就会停止振动。它通常会发生,如果它AlarmActivity
已经处于活动状态并且正在振动,或者之前已取消振动。我猜我在意图方面做了很多工作,或者在 Vibrator 实例方面做了很多工作?或者当我收到一条新文本时,手表需要振动器,而我的应用程序无法获取?
这是我的第一个 Android 应用程序,我尝试了很多不同的实现,但仍然不完美。