从后台服务打开应用程序

时间:2014-11-09 11:05:54

标签: android android-activity service

我设计的应用程序接收短信(短信),因此我在后台服务上实现了广播接收器。一切正常,但我无法从后台服务打开应用程序(任何活动类)。 我已经编写了一个代码来开始一项活动但是没有用。

我经历了许多类似的问题,但无法找到解决这个问题的方法。

这是服务类的代码片段:

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;
    }

}

1 个答案:

答案 0 :(得分:1)

  

一切正常

不,它没有。

您已经创建了一个匿名内部类的实例,它继承自BroadcastReceiver ...然后您没有对它做任何事情。该实例是onStartCommand()方法的局部变量,该实例将超出范围并在onStartCommand()返回后不久进行垃圾收集。

解决此问题:

  1. BroadcastReceiver移至常规独立public Java类。

  2. 在指向它的清单中添加<receiver>元素,并使用适当的<intent-filter>来接收您认为想要的任何广播。

  3. 如果您还没有<activity>,请添加{{1}},以便您的接收器在用户启动该活动后开始工作。

  4. 删除服务。

  5. 在您了解 为何实施服务之前,请不要再次编写其他服务。