Android服务 - 仅在应用未运行时

时间:2012-07-15 03:33:07

标签: android

我有一个用户在设备之间玩的游戏应用程序。我添加了一个服务,间歇性地检查远程玩家是否已经移动,然后通知本地用户它现在轮到他或她。我在游戏的主要活动中使用此代码根据用户对“间歇性”的偏好来启动服务

GAME

if (Settings.AlarmInterval != 0) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.add(Calendar.MINUTE, (int)(      Settings.AlarmInterval/1000/60));

            Intent myIntent = new Intent(mCtx, WakeCheck.class);

            pendingIntent = PendingIntent.getService(mCtx, 0, myIntent, 0);

            AlarmManager alarmManager = (AlarmManager)mCtx.getSystemService(mCtx.ALARM_SERVICE);
            alarmManager.cancel(pendingIntent); // cancel any previous alarms
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,  calendar.getTimeInMillis(), Settings.AlarmInterval, pendingIntent);
        }  

这很好用。但是,即使本地用户正在播放 服务唤醒的游戏并检查是否已经进行了一次移动。我想要 用户只有在当前没有玩游戏时才会收到通知。

如何在我的WakeCheck服务中检测到游戏正在运行并且无需检查远程游戏?

SERVICE

公共类WakeCheck扩展了服务{

    private triDbAdapter mDbHelper;
           private static final int CHALLENGE = -2;

@Override
public void onCreate() {
// TODO Auto-generated method stub
//Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG).show();
}



@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
//Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG).show();
return null;
}



@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mDbHelper.close();
//Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG).show();
}



@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);

    Cursor c;
    triDbAdapter mDbHelper = new triDbAdapter(this.getApplicationContext());
    mDbHelper.open();
    ServerCommunication sComm = new ServerCommunication(this.getApplicationContext());
    c = mDbHelper.fetchAllGames();
    Log.d("WAKE","Checking Game Status");

            <snip>
}

1 个答案:

答案 0 :(得分:0)

今年有人在Google I / O上提出了这个想法...当你的游戏活动进入前景时(例如onResume()),你将SharedPreferences中的布尔值设置为true表示用户正在播放。 WakeCheck将读取此值,如果为真,则无需检查远程播放。当游戏活动进入后台时(例如onPause()),它将值设置为false以与WakeCheck通信它需要检查远程播放。