0

我有应用程序,它在警报管理器中生成事件,并在特定时间调用它。代码看起来像这样

Intent intent = new Intent(this, AlarmActivity.class);
pendingIntent = PendingIntent.getActivity(this,req_code, intent, PendingIntent.FLAG_CANCEL_CURRENT);    
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),AlarmManager.INTERVAL_DAY*7,
                    pendingIntent);

Intent 调用此活动。

public class AlarmActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public void onStart(){
        super.onStart();
        //Change ringer mode
        //Add notification in status bar
        //Other booring stuff here...
        Toast.makeText(this,"Finishing",2000).show();
        finish();
    }
}

在无聊的东西中有一些代码应该在后台运行(更改铃声模式)

一切都对我有用,除了一件事。每当警报管理器调用我的活动时 - 应用程序就会进入前台。当它只应该在后台更改铃声模式,并在状态栏中添加通知。

有什么方法不允许应用程序出现在前台?

4

2 回答 2

2

您应该在BroadCastReceiver中完成所有这些操作。没有 UI,并且有一个Context变量传递给 Receiver 的onReceive()方法,它允许您基本上执行 Activity 所做的任何事情,而无需实际的 UI。这意味着您可以设置铃声、显示状态栏通知等。您的 BroadcastReceiver 类应如下所示:

public class AlarmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    //Change ringer mode
    //Add notification in status bar
    //Other boring stuff here...
    Toast.makeText(context,"Finishing",2000).show();
    }
}

请注意,对于您的Toast,使用了名为的变量context

您的AlarmManager代码应如下所示:

Intent intent = new Intent(this, AlarmBroadcastReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this,req_code, intent, PendingIntent.FLAG_CANCEL_CURRENT);    
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),AlarmManager.INTERVAL_DAY*7,
                    pendingIntent);

你的清单应该有这个:

 <receiver android:name=".AlarmBroadcastReceiver" >
        </receiver>
于 2012-12-21T20:29:46.293 回答
1

将此行添加到Activity您的AndroidManifest

android:theme="@android:style/Theme.NoDisplay"

并且您有一个没有任何内容可显示的活动。由于您已经finish();在调用代码,因此它看起来像是在后台运行。

于 2012-12-21T20:37:55.397 回答