Как я захватываю просто проанализированный Infobox статьи Википедии?

С тех пор, как я опубликовал этот вопрос, я реализовал два разных подхода к этому решению в нескольких приложениях.


APPROACH 1

Этот фрагмент взят из приложения, в котором я использую push-уведомления, которые требуют мгновенных вызовов для активации устройства. Вот что я делаю:

  1. использую разрешение WAKE_LOCK и
  2. используем абстрактный класс Wakelocker
  3. , используем его в Activity по мере необходимости:

Манифест:

<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 заботится о регулярном пробуждении вашей Службы.

9
задан Damjan Pavlica 18 October 2015 в 17:30
поделиться

4 ответа

Я предлагаю выполнить WebRequest против Википедии. Оттуда у вас будет страница, и вы можете просто проанализировать или запросить данные, которые вам нужны, с помощью регулярного выражения, обхода символов или какой-либо другой формы, с которой вы знакомы. По сути, это очистка экрана!

РЕДАКТИРОВАТЬ - Я бы добавил к этому ответу, что вы можете использовать HtmlAgilityPack для тех, кто владеет C #. Для PHP это выглядит как SimpleHtmlDom. Однако, похоже, что у Википедии более чем адекватный API. Этот вопрос, вероятно, лучше всего отвечает вашим потребностям:

Существует ли API Википедии?

-5
ответ дан 4 December 2019 в 08:16
поделиться

I suggest you use DBPedia instead which has already done the work of turning the data in wikipedia into usable, linkable, open forms.

10
ответ дан 4 December 2019 в 08:16
поделиться

Это зависит от того, по какому маршруту вы хотите пойти. Вот несколько возможностей:

  1. Установите MediaWiki с соответствующими модификации. В конце концов, это Приложение PHP предназначено именно для анализа wikitext ...
  2. Загрузите статическую версию HTML и проанализируйте нужные части.
  3. Используйте Wikipedia API с соответствующим кэшированием.

НЕ просто выберите последнюю версию активной страницы и повторяйте синтаксический анализ каждый раз, когда вашему приложению требуется коробка. Это огромная трата ресурсов как для вас, так и для Викимедиа.

2
ответ дан 4 December 2019 в 08:16
поделиться

если вы хотите разобрать все статьи один раз, в Википедии есть все статьи в формате xml,

http://en.wikipedia.org/wiki/Wikipedia_database

в противном случае вы можете просмотреть отдельные статьи, например

1
ответ дан 4 December 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: