0

5 分ごとに実行される IntentService があります。私が抱えている問題は、ユーザーがアプリの外にいるときに、サービスがアプリを起動することです。アプリを起動しないようにサービスに指定するにはどうすればよいですか? アプリの起動時にユーザーがテキストメッセージを送信している可能性があるため、現時点では望ましい効果はありません。

サービスを開始する方法。

// get a Calendar object with current time
             Calendar cal = Calendar.getInstance();
             // add 5 minutes to the calendar object
             cal.add(Calendar.MINUTE, 1);
             Intent intent = new Intent(EntryActivity.this, AlarmReceiver.class);
             intent.putExtra("alarm_message", "sending outstanding transactions");
             // In reality, you would want to have a static variable for the request code instead of 192837
             PendingIntent sender = PendingIntent.getBroadcast(EntryActivity.this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);

             // Get the AlarmManager service
             AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
             //am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
             //43200000 = 12 hours
             //3600000 = 1hr
             //1800000 = 30 mins
             //300000 = 5 mins

             am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 300000 , sender);

受信機。

public class AlarmReceiver extends BroadcastReceiver {

 @Override
 public void onReceive(Context context, Intent intent) {
   try {

     Bundle bundle = intent.getExtras();
     String message = bundle.getString("alarm_message");
    // Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
     Intent myIntent = new Intent(context, SendOutstandingTransactions.class);
     myIntent.setAction("com.carefreegroup.startatboot.MyService");
     context.startService(myIntent);

    } catch (Exception e) {
     Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
     e.printStackTrace();

    }
 }

}

.

public class SendOutstandingTransactions extends IntentService {

    private static final String TAG = SendOutstandingTransactions.class.getSimpleName();
    NfcScannerApplication nfcscannerapplication;
    Cursor c;
    //LocationManager             mlocManager;
    //LocationListener            mlocListener;
    SharedPreferences appSharedPrefs;
    Editor  prefsEditor;
    String companyID;

    @Override
    public void onCreate() {
        super.onCreate();
        nfcscannerapplication = (NfcScannerApplication)getApplication();
        //mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(SendOutstandingTransactions.this.getApplicationContext());
        prefsEditor = appSharedPrefs.edit();

    }





    @Override
    protected void onHandleIntent(Intent intent) {

        companyID = null;
        ContentValues messageValues = null;
        ContentValues phoneNumbers = null;
        c = nfcscannerapplication.loginValidate.queryAllFromCarer();
        String carerId = null;
        if(c != null && c.getCount() > 0){

        c.moveToLast();

         carerId = c.getString(c.getColumnIndex(LoginValidate.C_CARER_ID));
        companyID = c.getString(c.getColumnIndex(LoginValidate.C_COMP_ID));
        }

        //check to see if this service has run before
        Cursor howManyRuns = nfcscannerapplication.loginValidate.queryAllFromBackgroundServicesTable();

        if(howManyRuns.getCount() > 0){
            //service has run at least once before
            //do nothing

        }else{

            String hasRunOnce = "true";
            ContentValues cv = new ContentValues();
            cv.put(LoginValidate.C_BACKGROUNDSERVICES_HAVE_RUN_ONCE, hasRunOnce);
            nfcscannerapplication.loginValidate.insertIntoBackgroundServicesTable(cv);

        }


        Log.e(TAG, "inside onHandleIntent and about to do the service stuff");

        if(nfcscannerapplication.getSignalStrength() > 0 && isOnline() == true){


            DateTime now = new DateTime();
            now = now.minusDays(3);
            nfcscannerapplication.loginValidate.deleteTransactionsOlderThanSpecificTime(now);
            nfcscannerapplication.loginValidate.sendOutstandingTransactions();
            nfcscannerapplication.loginValidate.checkCompanyOptions();

            nfcscannerapplication.loginValidate.deleteTablePhone();
            phoneNumbers = nfcscannerapplication.loginWebservice.getCompanyPhonenumbers(companyID);

    ..................
..................
    ..................

[編集1]

// get a Calendar object with current time
             Calendar cal = Calendar.getInstance();
             // add 5 minutes to the calendar object
             cal.add(Calendar.MINUTE, 1);
             Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
             intent.putExtra("alarm_message", "sending outstanding transactions");
             // In reality, you would want to have a static variable for the request code instead of 192837
             PendingIntent sender = PendingIntent.getBroadcast(getApplicationContext(), 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);

             // Get the AlarmManager service
             AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
             //am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
             //43200000 = 12 hours
             //3600000 = 1hr
             //1800000 = 30 mins
             //300000 = 5 mins

             am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 150000 , sender);
4

1 に答える 1

1

アクティビティを画面に表示するには、何かを呼び出す必要がありましたstartActivity()が を呼び出しているのかstartActivity()なぜを呼び出しているのかを理解することが問題になる場合があります。ただし、通常、特定のアクティビティを開始するコード内の場所は 2、3 か所しかないため、通常はブレークポイントやLogステートメントなどを介して原因を突き止めることができます。

呼び出しがないstartActivity()場合、プロセスに以前のアクティビティ インスタンスが含まれている場合でも、ブロードキャストと開始されたサービスは純粋にバックグラウンドになります。

于 2013-03-22T16:35:03.363 に答える