Как создать фоновый сервис через AlarmManager с кодовым именем one native interface?

Первый раз пробую нативный интерфейс с Codename one для андроида. Я пытаюсь использовать приведенный ниже код, чтобы получить хранилище данных на сервере в фоновом режиме через определенное время, даже если приложение не запущено. Я не рассматриваю, включен ли сервис передачи данных / Wi-Fi или нет. Чтобы это сделать, я создаю нативную реализацию через Codename one. После того, как Google так много и перепробовал слишком много методов, все еще получаю ту же ошибку Looper.prepare(); для вызова обработчика. Код одной из моих попыток через service ниже. Я не программист Android, поэтому, пожалуйста, не считайте меня экспертом в Android.

Код в собственном Impl:

public class NativeCallImpl {

public void setNative(String param) {
    implCall ic = new implCall();
    ic.Native(param);
}

public boolean isSupported() {
    return true;
}
}

реализовать класс вызова:

class implCall extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); //To change body of generated methods, choose Tools | Templates.

}

public void Native(String param) {
    try {
        Toast.makeText(this, param, Toast.LENGTH_LONG).show();
        Intent intent = new Intent(getApplicationContext(), UploadData.class);
        PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0);

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTime().getTime(), 10000, pendingIntent);
        //startService(intent);   

    } catch (Exception e) {
        Toast.makeText(this, "Error " + e.getMessage(), Toast.LENGTH_LONG).show();
    }

}
}

Класс, вызываемый в Intent:

public class UploadData extends Service {

@Override
public void onStart(Intent intent, int startid) {
    //return super.onStartCommand(intent, flags, startId); //To change body of generated methods, choose Tools | Templates.
    try {

        String data = URLEncoder.encode("mobileNumber", "UTF-8") + "="
                + URLEncoder.encode(user.user.getMobileNumber(), "UTF-8");
        data += "&" + URLEncoder.encode("EventName", "UTF-8")
                + "=" + URLEncoder.encode("na", "UTF-8");
        data += "&" + URLEncoder.encode("Status", "UTF-8")
                + "=" + URLEncoder.encode("auto", "UTF-8");
        data += "&" + URLEncoder.encode("Latitude", "UTF-8")
                + "=" + URLEncoder.encode("lat", "UTF-8");
        data += "&" + URLEncoder.encode("Longitude", "UTF-8")
                + "=" + URLEncoder.encode("long", "UTF-8");
        data += "&" + URLEncoder.encode("Address", "UTF-8")
                + "=" + URLEncoder.encode("na", "UTF-8");
        data += "&" + URLEncoder.encode("imageCode", "UTF-8")
                + "=" + URLEncoder.encode("na", "UTF-8");

        URL url = new URL("http://example.com/appFiles/checkInOut/checkInOut.php");

        URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(data);
        wr.flush();

    } catch (Exception ex) {
        //Toast.makeText(null, ex.toString(), Toast.LENGTH_LONG).show();
        System.out.println(ex.getMessage());
    }
}

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

}

Сообщение об ошибке :

введите здесь описание изображения


person Prashant Rahate    schedule 15.04.2016    source источник
comment
вы не можете сделать это: implCall ic = new implCall(); вы должны объявить этот метод в классе, а не в действии, действие не может быть инициализировано таким образом   -  person JAAD    schedule 15.04.2016
comment
Почему вы не используете API локальных уведомлений codenameone — codenameone.com/blog/local- уведомления.html. он позволяет запланировать выполнение задачи в будущем в фоновом режиме (это реализовано с помощью AlarmManager )   -  person Chen    schedule 15.04.2016


Ответы (1)


Как упомянул @chen, вы должны использовать встроенные локальные уведомления и не нуждаться в нативных код для этого.

Это будет работать и для iOS, так что это намного лучше. Исключение под рукой вызывается, потому что вы используете поток Codename One вместо потока Android, который вам нужен, чтобы обернуть ваш вызов runOnUiThread из действия.

person Shai Almog    schedule 16.04.2016
comment
метод локального уведомления может работать в фоновом режиме, даже когда приложение не запущено, и может ли этот метод отправлять данные через запрос на подключение к серверу? (если да то через LocalNotificationCallback ты хотел сказать). Вопрос из-за этой строки: They are useful for communicating information to the user while the **app is running in the background**, since they manifest themselves as pop-up notifications on supported devices. - person Prashant Rahate; 16.04.2016
comment
Он будет передавать данные пользователю, когда приложение вообще не работает. Обратите внимание, что они не инициируют сетевое подключение, пока пользователь не щелкнет по ним. Вот как это работает для iOS, а Android согласовывает поведение с iOS для переносимости. - person Shai Almog; 17.04.2016