0

我的应用程序有错误...活动中的代码

SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
        String nastrPreferences = settings.getString(PREF_ACCOUNT_NAME, null);
        startService(new Intent(this, ServiceUpdate.class).putExtra("preferences", nastrPreferences));

在活动中,我运行我的服务。我输入意图“首选项” 在服务中我得到“首选项”并输入意图然后在 BroadcastReceiver 中传输

服务更新

package com.example.ok1;

import...
public class ServiceUpdate extends Service {

final String Tag="States";

//*******************Google*********************
    private static final Level LOGGING_LEVEL = Level.OFF;
    com.google.api.services.tasks.Tasks client;
    private static final String PREF_ACCOUNT_NAME = "accountName";

    static final String TAG = "TasksSample";

    static final int REQUEST_GOOGLE_PLAY_SERVICES = 0;

    static final int REQUEST_AUTHORIZATION = 1;

    static final int REQUEST_ACCOUNT_PICKER = 2;

    final HttpTransport transport = AndroidHttp.newCompatibleTransport();

    final JsonFactory jsonFactory = new GsonFactory();

    GoogleAccountCredential credential;

    List<String> tasksList;
    List<String> tasksList_Note;
    List<String> result_Date;
    final String ATTRIBUTE_TITLE_TEXT="title";
    final String ATTRIBUTE_NOTE_TEXT="note";
    final String ATTRIBUTE_DATE_TEXT="date";
    static String preferences;
    DBHelper dbHelper;

    static com.google.api.services.tasks.Tasks service;

    int numAsyncTasks;



    //***********************************************8

    public static final int INTERVAL = 100000; // 10 sec
      public static final int FIRST_RUN = 5000; // 5 seconds
      int REQUEST_CODE = 11223344;

      AlarmManager alarmManager;

@Override
public void onCreate() {
    // TODO: действия, которые будут выполняться при создании сервиса

    Log.d(Tag, "onStartCommand");
}

public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(Tag, "onCreate");
    someTask();
    return START_REDELIVER_INTENT;
  }

public void onDestroy() {
  }

@Override
public IBinder onBind(Intent arg0) {
    // TODO Привязка сервиса

    return null;
}

void someTask() {
    //************перезапускать сервис буду тут************
    Intent intent = new Intent(this, RepeatingAlarmService.class);
    intent.putExtra("preferences", preferences);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, REQUEST_CODE, intent, 0);

    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    if (alarmManager != null) {
          alarmManager.cancel(PendingIntent.getBroadcast(this, REQUEST_CODE, intent, 0));
        }
        Toast.makeText(this, "Service Stopped!", Toast.LENGTH_LONG).show();
        Log.d(Tag, "Service onDestroy(). Stop AlarmManager at " + new java.sql.Timestamp(System.currentTimeMillis()).toString());
    alarmManager.setRepeating(
        AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime() + FIRST_RUN,
        INTERVAL,
        pendingIntent);

    Toast.makeText(this, "Service Started.", Toast.LENGTH_LONG).show();
    Log.v(this.getClass().getName(), "AlarmManger started at " + new java.sql.Timestamp(System.currentTimeMillis()).toString());

  }

}

重复报警服务

package com.example.ok1;

import...
public class RepeatingAlarmService extends BroadcastReceiver {
final String Tag="States";
//*******************Google*********************
private static final Level LOGGING_LEVEL = Level.OFF;
com.google.api.services.tasks.Tasks client;
private static final String PREF_ACCOUNT_NAME = "accountName";

static final String TAG = "TasksSample";

static final int REQUEST_GOOGLE_PLAY_SERVICES = 0;

static final int REQUEST_AUTHORIZATION = 1;

static final int REQUEST_ACCOUNT_PICKER = 2;

final HttpTransport transport = AndroidHttp.newCompatibleTransport();

final JsonFactory jsonFactory = new GsonFactory();

GoogleAccountCredential credential;

List<String> tasksList;
List<String> tasksList_Note;
List<String> result_Date;
final String ATTRIBUTE_TITLE_TEXT="title";
final String ATTRIBUTE_NOTE_TEXT="note";
final String ATTRIBUTE_DATE_TEXT="date";
String preferences;
Context ctx;

static com.google.api.services.tasks.Tasks service;

int numAsyncTasks;



//***********************************************8
public void onReceive(Context context, Intent intent) {
   // Toast.makeText(context, "It's Service Time!", Toast.LENGTH_LONG).show();
    Log.d(Tag, "1Timed alarm onReceive() started at time: " + new java.sql.Timestamp(System.currentTimeMillis()).toString());
   ctx = context;

   preferences= intent.getStringExtra("preferences");//.getExtras().getString("preferences");
   googleConnect();

}

//гуглловская функция
    public void googleConnect() {
        //****************************Google********
        Log.d(Tag, "СТАРТУЕТ GOOGLEв сервисе....preferences="+preferences);
        Logger.getLogger("com.google.api.client").setLevel(LOGGING_LEVEL); 
        // Google Accounts
        credential = GoogleAccountCredential.usingOAuth2(ctx, TasksScopes.TASKS);

        credential.setSelectedAccountName(preferences);


        // Tasks client
        service =
                new com.google.api.services.tasks.Tasks.Builder(transport, jsonFactory, credential)
        .setApplicationName("Google-TasksAndroidSample/1.0").build();
        if (checkGooglePlayServicesAvailable()) {
            haveGooglePlayServices();
        }
        //************************************************  
    }
    /** Check that Google Play services APK is installed and up to date. */
    private boolean checkGooglePlayServicesAvailable() {
        Log.d(Tag, "checkGooglePlayServicesAvailable*****************************");
        final int connectionStatusCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(ctx);
        if (GooglePlayServicesUtil.isUserRecoverableError(connectionStatusCode)) {
            //  showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode);
            return false;
        }
        return true;
    }

    private void haveGooglePlayServices() {
        Log.d(Tag, "haveGooglePlayServices********************************");
        // check if there is already an account selected
        //  credential == TasksSample.c
        if (credential.getSelectedAccountName() == null) {
            Log.d(Tag, "user to choose account");
            // ask user to choose account
        //  chooseAccount();
        } else {
            Log.d(Tag, "load calendars in the receiver");
            myF();              
        }
    }

    public void myF() {
        try {
            List<Task> tasks = service.tasks().list("@default").execute().getItems();
            Log.d(Tag, "получили таск");
        } catch (Exception e) {
            // TODO: handle exception
            Log.d(Tag, e.getMessage());
        }

    }

}

但在

 preferences= intent.getStringExtra("preferences");

我得到了偏好= null。意图没有“偏好”。为什么?什么我不正确?日志

05-31 19:58:32.337: E/GoogleAuthUtil(19130): Calling this from your main thread can lead to deadlock and/or ANRs
05-31 19:58:32.337: E/GoogleAuthUtil(19130): java.lang.IllegalStateException: calling this from your main thread can lead to deadlock
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.google.android.gms.auth.GoogleAuthUtil.b(Unknown Source)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:192)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:217)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:836)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:412)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:345)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:463)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.example.ok1.RepeatingAlarmService.myF(RepeatingAlarmService.java:126)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.example.ok1.RepeatingAlarmService.haveGooglePlayServices(RepeatingAlarmService.java:110)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.example.ok1.RepeatingAlarmService.googleConnect(RepeatingAlarmService.java:85)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.example.ok1.RepeatingAlarmService.onReceive(RepeatingAlarmService.java:65)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:1798)
v05-31 19:58:32.337: E/GoogleAuthUtil(19130):   at android.app.ActivityThread.access$2400(ActivityThread.java:117)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:985)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at android.os.Looper.loop(Looper.java:130)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at android.app.ActivityThread.main(ActivityThread.java:3687)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at java.lang.reflect.Method.invokeNative(Native Method)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at java.lang.reflect.Method.invoke(Method.java:507)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
05-31 19:58:32.337: E/GoogleAuthUtil(19130):    at dalvik.system.NativeStart.main(Native Method)
4

2 回答 2

0

当您获得 PendingIntent 时分配一个唯一的 REQUEST_CODE:

PendingIntent.getBroadcast(context, REQUEST_CODE , showIntent, 0); 

这样,您就可以向系统注册不同/唯一的意图实例。

唯一的 REQUEST_CODE 应该是当前系统时间。

int REQUEST_CODE = (int) System.currentTimeMillis();
于 2013-05-31T15:24:17.453 回答
0

preferences您忘记为String in赋值ServiceUpdateonStartCommand在调用方法之前,您需要在 Service 方法中从 Intent 中获取值someTask()

public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(Tag, "onCreate");
    preferences= intent.getStringExtra("preferences"); //<<<<
    someTask();
    return START_REDELIVER_INTENT;
  }
于 2013-05-31T15:30:06.427 回答