我设计的应用程序接收短信(短信),因此我在后台服务上实现了广播接收器。一切正常,但我无法从后台服务打开应用程序(任何活动类)。 我已经编写了一个代码来开始一项活动但是没有用。
我经历了许多类似的问题,但无法找到解决这个问题的方法。
这是服务类的代码片段:
public class Background extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
new BroadcastReceiver() {
String Number, Body;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle bundle = intent.getExtras();
Object[] messages = (Object[]) bundle.get("pdus");
SmsMessage[] sms = new SmsMessage[messages.length];
for (int n = 0; n < messages.length; n++) {
sms[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
}
for (SmsMessage msg : sms) {
Body = new StringBuilder().append(msg.getMessageBody())
.toString();
Number = new StringBuilder().append(
msg.getDisplayOriginatingAddress()).toString();
}
Calendar c = Calendar.getInstance();
// "5/11/2014 03:02:10"
String date = c.get(Calendar.DAY_OF_MONTH) + "/"
+ c.get(Calendar.MONTH) + "/" + c.get(Calendar.YEAR)
+ " " + c.get(Calendar.HOUR) + ":"
+ c.get(Calendar.MINUTE) + "" + c.get(Calendar.SECOND);
MessageData db = new MessageData(getApplicationContext());
try {
db.open();
db.createEntry(Number, Body, date, 0);
db.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Intent intent2 = new Intent(Background.this, CallingTimer.class);
intent2.setFlags(Intent.FLAG_FROM_BACKGROUND);
intent2.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
};
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
答案 0 :(得分:1)
一切正常
不,它没有。
您已经创建了一个匿名内部类的实例,它继承自BroadcastReceiver
...然后您没有对它做任何事情。该实例是onStartCommand()
方法的局部变量,该实例将超出范围并在onStartCommand()
返回后不久进行垃圾收集。
解决此问题:
将BroadcastReceiver
移至常规独立public
Java类。
在指向它的清单中添加<receiver>
元素,并使用适当的<intent-filter>
来接收您认为想要的任何广播。
如果您还没有<activity>
,请添加{{1}},以便您的接收器在用户启动该活动后开始工作。
删除服务。
在您了解 为何实施服务之前,请不要再次编写其他服务。