所以我有这个非常简单的应用程序。它将加密的SMS消息发送到指定的电话号码。它工作膨胀,但我遇到问题,找到一种方法使收到的消息自动显示在消息日志中。我当前有一个“刷新”按钮,如果有新消息可以更新消息日志。我不想使用刷新按钮,我希望消息只是在收到时显示。
应用程序的工作方式是,它从文本框中发送消息并对其进行加密。然后它发送消息,当收到消息时,它会解密并存储在一个变量中并显示在消息日志中(在我按下“刷新”之后)。
我在google上尝试了很多搜索,但找不到有用的东西,因为这些字词过于敏感。我经常找到无法接收消息的人的链接,或只是链接下载消息应用程序。
以下是我的一些代码。这是接收短信部分。
public class SmsReceiver extends BroadcastReceiver
{
public static String decrypted = "";
@Override
public void onReceive(Context context, Intent intent)
{
//---get the SMS message passed in---
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str ="";
String info = "";
if (bundle != null)
{
//---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
info += "SMS from " + msgs[i].getOriginatingAddress();
info += " : ";
str += msgs[i].getMessageBody().toString();
if (i==msgs.length-1 && MainActivity.locked == true){
try {
decrypted = AESHelper.decrypt(MainActivity.seed, str);
} catch (Exception e) {
e.printStackTrace();
}
MainActivity.rand = Math.random();
MainActivity.seed = String.valueOf(MainActivity.rand);
decrypted = info + decrypted;
info = "";
MainActivity.locked = false;
}
}
}
因此,在我的主要活动中,我设置了刷新按钮以检查decrypted
的长度。如果长度为decrypted
&gt; 0然后我获取decrypted
的内容并将其显示在消息日志中。
答案 0 :(得分:1)
有多种方法可以做到这一点。简单的方法是使用在MainActivity中每秒运行一次的TimerTask来检查'decrypted'变量的长度。 Timertask不在ui线程上运行。但是因为你只使用它来检查一个变量的长度你应该没问题。如果您需要有关timertask的帮助,请使用以下示例:
Timer timer = new Timer();
timer.scheduleAtFixedRate(new SpecificTask(), 1000, 200);
但是你必须定义你的SpecificTask()类......
private Specific Task extends TimerTask{
@Override
public void run() {
if(decrypted.length()>0){
//do refresh here but make sure you run this code onuithread
//just use runonuithread...
}
}
}
或者您可以使用处理程序对象...
boolean mStopHandler = false;
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (!mStopHandler) {
if(decrypted.length()>0){
//refreshlayout code
}
handler.postDelayed(this, 500);
}
}
};
// start your handler with:
handler.post(runnable);