С тех пор, как я опубликовал этот вопрос, я реализовал два разных подхода к этому решению в нескольких приложениях.
APPROACH 1
Этот фрагмент взят из приложения, в котором я использую push-уведомления, которые требуют мгновенных вызовов для активации устройства. Вот что я делаю:
Манифест:
<uses-permission android:name="android.permission.WAKE_LOCK" />
Класс WakeLocker:
public abstract class WakeLocker {
private static PowerManager.WakeLock wakeLock;
public static void acquire(Context context) {
if (wakeLock != null) wakeLock.release();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP |
PowerManager.ON_AFTER_RELEASE, "WakeLock");
wakeLock.acquire();
}
public static void release() {
if (wakeLock != null) wakeLock.release(); wakeLock = null;
}
}
Пример класса активности:
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Waking up mobile if it is sleeping
WakeLocker.acquire(getApplicationContext());
// do something
WakeLocker.release();
}
APPROACH 2
Лучше всего, если вы хотите, чтобы Android контролировал пробуждение, и можете жить с периодическим пробуждением вашего кода , Просто используйте AlarmManager для регулярного вызова класса Service. Вот некоторый код из моего приложения LifeLog24:
MainActivity
Intent ll24 = new Intent(context, AlarmReceiverLifeLog.class);
PendingIntent recurringLl24 = PendingIntent.getBroadcast(context, 0, ll24, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.RTC_WAKEUP, first_log.getTime(), AlarmManager.INTERVAL_HOUR, recurringLl24); // Log repetition
Класс тревоги
public class AlarmReceiverLifeLog extends BroadcastReceiver {
private static final String TAG = "LL24";
static Context context;
@Override
public void onReceive(Context context, Intent intent) {
Log.v(TAG, "Alarm for LifeLog...");
Intent ll24Service = new Intent(context, LifeLogService.class);
context.startService(ll24Service);
}
}
и LifeLogService .класс, где я делаю свои вещи. В этом случае будильник срабатывает каждый час и запускает BroadcastReceiver, который в свою очередь запускает службу. Это еще не все, чтобы убедиться, что служба не запускается дважды и так далее, но вы понимаете, как это делается. А на самом деле AlarmManager - лучший способ сделать это, так как вы не беспокоитесь об использовании батареи и т. Д., А Android заботится о регулярном пробуждении вашей Службы.
Я предлагаю выполнить WebRequest против Википедии. Оттуда у вас будет страница, и вы можете просто проанализировать или запросить данные, которые вам нужны, с помощью регулярного выражения, обхода символов или какой-либо другой формы, с которой вы знакомы. По сути, это очистка экрана!
РЕДАКТИРОВАТЬ - Я бы добавил к этому ответу, что вы можете использовать HtmlAgilityPack для тех, кто владеет C #. Для PHP это выглядит как SimpleHtmlDom. Однако, похоже, что у Википедии более чем адекватный API. Этот вопрос, вероятно, лучше всего отвечает вашим потребностям:
I suggest you use DBPedia instead which has already done the work of turning the data in wikipedia into usable, linkable, open forms.
Это зависит от того, по какому маршруту вы хотите пойти. Вот несколько возможностей:
НЕ просто выберите последнюю версию активной страницы и повторяйте синтаксический анализ каждый раз, когда вашему приложению требуется коробка. Это огромная трата ресурсов как для вас, так и для Викимедиа.
если вы хотите разобрать все статьи один раз, в Википедии есть все статьи в формате xml,
http://en.wikipedia.org/wiki/Wikipedia_database
в противном случае вы можете просмотреть отдельные статьи, например