3

アラームサービスを利用しました。1分ごとに実行するアラームを実装しました。そのため、ブロードキャスト レシーバーの onReceive メソッドは、アプリが終了した後でも呼び出されます。この onReceive メソッド内にタイマーを実装したいと考えています。位置追跡を開始し、20 秒待ってから、位置追跡を停止する必要があります。

私は以下を試しました、

TimerTask
Handler
Local Broadcast Receiver

ただし、アプリが終了すると、上記のすべてが実行できなくなります。

アラーム受信機の内部で、20 秒間待機するタイマーを実装したいと考えています。
アプリが終了状態のときにこれを達成するにはどうすればよいですか?

私の AlaramReceiver onReceive メソッド:

 @Override
public void onReceive(Context context, Intent intent) {
    mContext = context;
    mSharedPrefManager = SharedPrefManager.getInstance(mContext);

    mAppUtilInstance.logDebugMessage(TAG, "Track interval alarm receiver.");

    // // Check the preference having any current activity
    if (mSharedPrefManager.checkForCurrentActivityPref()) {
        userActivity = mSharedPrefManager.getCurrentUserActivityPref();

        if (mSharedPrefManager.getIsUserMovedPref()) {
            // User MOVED
            // Call the location service
            LocationUpdateTimer locationUpdateTimer = new LocationUpdateTimer(
            mContext, userActivity, true);
                locationUpdateTimer.initialize();
            mSharedPrefManager.setIsUserMovedPref(false);
        } else {
            // User not MOVED in between the track interval period. He is
            // IDLE
            // Check whether the location information is returned by the
            // google API
            if (mSharedPrefManager.checkForLocationEntityPref()
                    && mSharedPrefManager.getLocationEntityPref()
                            .getLatitude().length() > 0) {
                // Send the packet information to the Fleetilla server
                StoreAndSendLocationInformation storeAndSendLocationInformation = new StoreAndSendLocationInformation(
                        mContext,
                        mSharedPrefManager.getLocationEntityPref(),
                        userActivity);
                storeAndSendLocationInformation.storeAndSend();
            } else {
                // If the location information is not available
                mAppUtilInstance
                        .logDebugMessage(TAG,
                                "Location information is not generated to store and send.");
            }
        }
    }
}

位置更新タイマー クラス:

/**
 * LocationUpdateTimer Constructor
 */
public LocationUpdateTimer(Context context, String userActivity,
        boolean isTosend) {
    // Save the context
    mContext = context;
    mUserCurrentActivity = userActivity;
    isToSendLocationInfo = isTosend;
}

/**
 * To start the location reporting
 */
private void startLocationReporting() {
    if (mLocationProviderStatusListener != null) {
        mLocationProviderStatusListener
                .requestLocationProvidersToUpdateStatus(mConstants.EMPTY_STRING);
        scheduleTimerTask();
    }
}

/**
 * To schedule the 20 seconds timer task to get the best location
 * information and send it to Fleetilla server.
 */
private void scheduleTimerTask() {
    bestGPSInfoTimerHandler = new Handler();
    bestGPSInfoTimerHandler.postDelayed(bestGPSInfoRunnable,
            Constants.TIMER_TASK_DELAY);
    mAppUtilInstance.logDebugMessage(TAG,
            "20 Sec Location Update TimerTask Scheduled");
}

/**
 * To cancel the timer tack which was scheduled for 30sec location update
 */
private void cancelTimerTask() {
    if (bestGPSInfoTimerHandler != null) {
        mAppUtilInstance.logDebugMessage(TAG, "20 sec TimerTask canceled");
        bestGPSInfoTimerHandler.removeCallbacks(bestGPSInfoRunnable);
        bestGPSInfoTimerHandler = null;
    }
}
/**
 * A runnable will be called after the 20 sec time interval
 */
Runnable bestGPSInfoRunnable = new Runnable() {
    @Override
    public void run() {
        // Called after 20 seconds
        mAppUtilInstance.logDebugMessage(TAG,
                "TimerTask running after 20 sec interval.");
        stopLocationReporting();
        cancelTimerTask();

        if (isToSendLocationInfo) {
            // Check whether the location information is returned by the
            // google api
            if (mSharedPrefManager.checkForLocationEntityPref()
                    && mSharedPrefManager.getLocationEntityPref()
                            .getLatitude().length() > 0) {
                // Send the packet information to the server
                StoreAndSendLocationInformation storeAndSendLocationInformation = new StoreAndSendLocationInformation(
                        mContext,
                        mSharedPrefManager.getLocationEntityPref(),
                        mUserCurrentActivity);
                storeAndSendLocationInformation.storeAndSend();
            } else {
                // If the location information is not available
                mAppUtilInstance
                        .logDebugMessage(TAG,
                                "Location information is not generated to store and send.");
                mAppUtilInstance
                        .broadcastStatusMessage(
                                mContext,
                                Constants.STATUS_MSG_127
                                        + "Location information is not generated to store and send.",
                                Constants.STATUS_CODE_127);
            }
        }

    }
};
4

2 に答える 2

0

PendingIntent を持つ AlarmManager は機能します。これは、私のアプリの1つで行う方法です。

    myAlarm = (AlarmManager) getSystemService(ALARM_SERVICE);
    Intent myNewIntent = new Intent(MyCurrentActivityClass.this, MyNewActivityClass.class);
    Calendar wakeUpTime = Calendar.getInstance(); 
    wakeUpTime.add(Calendar.MILLISECOND, (int) myTimeRemaining); 

    myPendingIntent = PendingIntent.getActivity(MyCurrentActivityClass.this, 0, myNewIntent, 0);
    myAlarm.set(AlarmManager.RTC_WAKEUP, wakeUpTime.getTimeInMillis(), myPendingIntent);

MyNewActivityClass に次のコードを追加して、デバイスを起動し、セキュリティ画面を表示することもできます。

public void onAttachedToWindow() {
    //make the activity show even the screen is locked.
    Window window = getWindow();

    window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
}
于 2014-12-30T09:54:23.563 に答える