Пример BroadCastREceiver
public class SchedulerMailBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
try {
Log.i("scheduler: " + new DateWrapper().getLocaleString());
PowerManager pm = (PowerManager) context.getApplicationContext().getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = null;
if (pm != null) {
Log.d("aquire wakelog");
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ics:mailScheduler");
wl.acquire(10000);
}
startInNewThread(context.getApplicationContext(),wl);
}catch(Exception e){
Log.e(e);
}
}
public void startInNewThread(final Context context, PowerManager.WakeLock wl){
new ThreadWrapper(() -> {
try {
//Do Stuff
}catch(Exception e){
Log.e(e);
}finally {
Log.d("releasing wakelog");
try {
wl.release();
Log.i("released wakelog");
}catch(Exception e){
Log.e("wakelog release","exception on releasing wawkelog");
}
}
}).start();
}
public static boolean registerScheduler(Context context){
final int requestCode=1234;
Intent intent = new Intent(context, SchedulerMailBroadcastReceiver.class);
intent.setAction("startScheduler");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
if (alarmManager != null) {
// alarmManager.cancel(previousPendingIntent);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 1000 * 60*15, pendingIntent);
Log.i("registered repeating");
}
return true;
}
}
вы, вероятно, не хотите setRepeating через
Пример JobService
public class SchedulerMailJobManager extends JobService{
@Override
public boolean onStartJob(JobParameters params) {
try {
Log.i("SchedulerMailJobManager","scheduler run at "+ new DateWrapper().getLocaleString());
startInNewThread(getApplicationContext(),params);
return true;
}catch(Exception e){
Log.e("SchedulerMailJobManager","errpr in starting new thread",e);
return false;
}
}
@Override
public void onDestroy(){
Intent intent = new Intent(this,ServiceRestarter.class);
intent.setAction("restartService");
intent.putExtra("service","mailScheduler");
sendBroadcast(intent);
}
@Override
public boolean onStopJob(JobParameters params) {
Log.w("stoppedJob","stopped");
return true;
}
public void startInNewThread(final Context context,final JobParameters params){
new ThreadWrapper(() -> {
try {
//Do Stuff
}catch(Exception e){
Log.e("JobScheduler2ndThread","Exception",e);
}finally {
if(params!=null) {
this.jobFinished(params,false);
}else{
Log.e("JobScheduler2ndThread","no params for jobFinished");
}
}
}).start();
}
static JobInfo createScheduledJob(Context context){
ComponentName serviceComponent = new ComponentName(context,SchedulerMailJobManager.class );
JobInfo.Builder builder=new JobInfo.Builder(1234,serviceComponent);
int waitMin=30;
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
builder.setPersisted(true);
builder.setPeriodic(1000*60*waitMin,1000);
return builder.build();
}
public static boolean registerScheduler(Context context){
JobScheduler scheduler=context.getSystemService(JobScheduler.class);
if(scheduler==null){
Log.e("registerScheduler","scheduler is null");
return false;
}
if(scheduler.getPendingJob(1234)!=null) {
scheduler.cancel(1234);
Log.i("registerScheduler","cancelled previous");
}
int resultCode=scheduler.schedule(createScheduledJob(context));
if(resultCode==JobScheduler.RESULT_SUCCESS){
Log.i("JobManagerScheduler","registered new scheduler");
return true;
}else{
Log.e("registerScheduler","failed registering");
return false;
}
}
}
, поскольку у вас есть только Уведомление, вам, вероятно, не нужно ничего начинать в новом потоке, что означает, что в этом решении вы должны вернуть false в OnStartJob
Для современных браузеров вы можете попробовать следующий подход:
https://developer.mozilla.org/en/HTTP_access_control
Короче говоря, вам нужно добавить следующее в заголовок ответа SERVER
(следующий код разрешает доступ к из foo.example
):
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER
Access-Control-Max-Age: 1728000
Обратите внимание, что X-PINGOTHER
- это настраиваемый заголовок, который вставляется с помощью JavaScript и должен отличаться от сайта к сайту.
Если вы хотите, чтобы какой-либо сайт имел доступ к вашему серверу в Ajax, используйте вместо него *
.
Изменить:
Когда я впервые ответил на вопрос от 2009 , я действительно столкнулся с той же проблемой, и я решил ее, используя конфигурацию на стороне сервера.
К тому времени не было плагина для FF или Chrome.
Однако теперь мы делаем есть альтернативы, использующие плагин на стороне браузера,проверьте ответ tsds
Вы попытались использовать jQuery запрос ajax? С версии 1.3 jQuery поддерживает определенные типы перекрестного домена ajax запросы.
Заключение в кавычки из ссылки выше:
Примечание: Все удаленные (не на том же домене) запросы должны быть определены, как ДОБИРАЮТСЯ, когда 'сценарий' или 'jsonp' являются типом данных (потому что он загружает сценарий с помощью тега script DOM). Опции Ajax, которые требуют объекта XMLHttpRequest, не доступны для этих запросов. Полные функции и функции успеха называют на завершении, но не получают объект XHR; beforeSend и функции dataFilter не называют.
С jQuery 1.2, можно загрузить данные JSON, расположенные на другом домене при определении обратного вызова JSONP который может быть сделан как так: "myurl? обратный вызов =?". jQuery автоматически заменяет? с корректным именем метода для вызова, называя указанный обратный вызов. Или при установке типа данных на "jsonp", обратный вызов будет автоматически добавлен к запросу Ajax.
Я попытался использовать ту вещь 'UniversalBrowswerRead' также, и она не работала. Вы могли бы быть в состоянии добавить 'позволить' заголовок, но я на самом деле не попытался делать его все же. Это является довольно новым.
можно найти больше информации здесь
Что относительно того, чтобы использовать что-то как mod_proxy? Тогда это смотрит на Ваш браузер как запросы, идут в тот же сервер, но они действительно передаются другому серверу.
Вот вещь, нет никакого способа "временно" отключить междоменный XMLHttpRequest, если можно отключить его временно затем, это может быть отключено постоянно. Это - довольно типичная проблема в современном из программирования Ajax и чаще всего решается с помощью техники, известной как междоменные сценарии.
Идея, здесь являющаяся, состоит в том, что, если Вы обращаетесь к междоменному сценарию, он возвращает JavaScript (JSON) результаты, которые затем передаются функции на Вашем конце.
Вот некоторый пример кода, чтобы проиллюстрировать, как это может посмотреть с точки зрения кода JavaScript:
function request_some_data() {
var s = "http://my.document.url.com/my_data?p1=v1&p2=v2&callback=myfunc";
try {
try{
document.write("<scr"+"ipt type='text/javascript' src='"+s+"'></scr"+"ipt>");
}
catch(e){
var x = document.createElement("script");
x.src = s;
document.getElementsByTagName("head")[0].appendChild(x);
}
}
catch (e) {
alert(e.message);
}
}
Вы затем определите функцию в своем коде, который получает данные, и в сервере Вы "обрабатываете" случай обратного вызова, вот клиентский JavaScript:
function myfunc(data) {
alert(data);
}
И на стороне сервера, здесь я даю пример PHP, но это может быть сделано столь же легко в Java или независимо от того, что Ваша технология серверной стороны:
<?php
if($_GET["callback"]) {
print($_GET["callback"] . "(");
}
/* place your JSON object code/logic here */
if($_GET["callback"]) {
print(");");
}
?>
Обратите внимание, что то, что Вы генерируете на стороне сервера, завершает то, чтобы быть некоторым JavaScript, который выполняется на стороне клиента.
I'm facing this from file://
. I'd like to send queries to two servers from a local HTML file (a testbed).
This particular case should not be any safety concern, but only Safari allows this.
Here is the best discussion I've found of the issue.