1

我有 2 个活动,一个主要活动和 SetAlarm 活动。我从 Main 调用 SetAlarm Activity。当我设置警报时,我创建了一个我的 main 实例。如何在不创建 Main 的另一个实例的情况下设置警报,或者在设置警报之前杀死 main?对此很陌生。我已经阅读了几个警报管理器示例,但它们似乎都建立了一个新的意图,我认为这就是创建我的 2 个实例的原因。这就是你设置闹钟的方式。它确实熄灭了。

这是我从 Main 调用 SetAlarm 的方式:

public void setAlarm(View view) {
    Intent intent = new Intent(this, SetAlarmActivity.class);
    startActivityForResult(intent, 2);  
} 

这是我设置警报的方法:

public void setUpAlarm() {
    if (VERBOSE) Log.v(TAG, "+++ IN setUpAlarm +++");                   
        PLAY_MUSIC = "Y";
        Intent intentAlarm = new Intent(this, MainActivity.class);
        intentAlarm.putExtra("playMusic",PLAY_MUSIC);
        intentAlarm.putExtra("mPos", mPos);
        intentAlarm.putExtra("result",ALARM_SET);
        setResult(RESULT_OK,intentAlarm);
        pIntent = PendingIntent.getActivity(this, 12345, 
                intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager am = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));
        am.set(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), pIntent );
    } // setAlarmPlaySong

我主要切断了警报:

@Override
public void onResume() {
    if (VERBOSE) Log.v(TAG, "+++ IN onResume +++");
    super.onResume();  
    Intent intent = getIntent()
    if (intent.hasExtra("playMusic")  && intent.hasExtra("mPos")) {
   playMusicFlag = intent.getStringExtra("playMusic"); 
   mPos = intent.getIntExtra("mPos", 0);   
   if (playMusicFlag.equalsIgnoreCase("Y")) {
       if (VERBOSE) Log.v(TAG, "+++ playMusicFlag is SET+++");
           playSongs();
               showStopAlarmButton();
       } // if    
   }
}
4

3 回答 3

2

如果您希望您的 startActivity 不应该启动多个 alam 活动实例,您应该转到您的清单,并且必须为您的警报活动添加一个名为 launchMode 的属性并将其设置为 SingleTop,这将确保只有一个实例保留在 taskk 回栈中(每个活动都以 LIFO 方式进行的地方)

于 2013-04-21T06:01:46.090 回答
0

我不知道为什么你有 SetAlarm Activity,你不需要一个活动来设置警报。无论如何,AlarmManager 工作起来很痛苦。我花了一段时间才启动并运行它。这就是我现在在我的代码中运行的内容。

        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.SECOND, 5);
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        Intent notifyintent = new Intent(this, OnAlarmReceiver.class);
        notifyintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        notifyintent.setAction("android.intent.action.NOTIFY");
        PendingIntent notifysender = PendingIntent.getBroadcast(this, 0, notifyintent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 20 * 1000,
                notifysender);

报警接收器

public class OnAlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // PullPendingRequests.acquireStaticLock(context)
        try {
            lock = getLock(context);
            lock.acquire();
            context.startService(new Intent(context, UpdateCustomerRequests.class));
        } finally {
            if (lock.isHeld()) {
                lock.release();
            }
        }
    }

    private static final String NAME = "com.commonsware.cwac.wakeful.WakefulIntentService";
    private static volatile PowerManager.WakeLock lockStatic = null;
    private static PowerManager.WakeLock lock;

    synchronized private static PowerManager.WakeLock getLock(Context context) {
        if (lockStatic == null) {
            PowerManager mgr = (PowerManager) context.getSystemService(Context.POWER_SERVICE);

            lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, NAME);
            lockStatic.setReferenceCounted(true);
        }

        return (lockStatic);
    }
}

OnAlarmReceiver 调用的 IntentService

public class UpdateCustomerRequests extends IntentService {
@Override
    final protected void onHandleIntent(Intent intent) {
        //
        //Your stuff here
        //
    }

    public class LocalBinder extends Binder {
        public UpdateCustomerRequests getService() {
            return UpdateCustomerRequests.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return bindToHomeScreen;
    }
}

安卓清单

  • 清单标签内

<uses-permission android:name="android.permission.WAKE_LOCK" />

  • 内部应用程序标签

        <receiver
            android:name="com.taxeeta.support.OnAlarmReceiver"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.NOTIFY" />
            </intent-filter>
        </receiver>
    
于 2013-04-21T18:51:22.477 回答
0

默认情况下,Activity可以在多个任务上多次实例化 an。如果您想保持单一,请android:launchMode="singleTask"在 AnroidManifest.xml 中的活动声明中指定并覆盖Activity#onNewIntent()您的主要活动以接收新的意图,AlarmManager如果主要活动已经实例化。

请参阅任务和返回堆栈以了解更多信息。您面临的情况几乎与图 3相同。

于 2013-04-21T06:06:49.320 回答