Статьи

Обучение Android: получение сервиса для связи с деятельностью

В приложении, над которым я работаю, я создал службу, которая работает в фоновом режиме вдали от основного потока пользовательского интерфейса и использует потоковый API Twitter с использованием twitter4j .

Это выглядит так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class TweetService extends IntentService {
    String consumerKey = "TwitterConsumerKey";
    String consumerSecret = "TwitterConsumerSecret";
  
    public TweetService() {
        super("Tweet Service");
    }
  
    @Override
    protected void onHandleIntent(Intent intent) {
        AccessToken accessToken = createAccessToken();
  
        StatusListener listener = new UserStreamListener() {
           // override a whole load of methods - removed for brevity
  
            public void onStatus(Status status) {
                String theTweet = status.getText();
                if (status.getText().contains("http://")) {
                    // do something with the tweet
                }
  
            }
        };
        ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
        configurationBuilder.setOAuthConsumerKey(consumerKey);
        configurationBuilder.setOAuthConsumerSecret(consumerSecret);
  
        TwitterStream twitterStream = new TwitterStreamFactory(configurationBuilder.build()).getInstance(accessToken);
        twitterStream.addListener(listener);
        twitterStream.user();
    }
}

Это вызывается из MyActivity так:

1
2
3
4
5
6
7
8
9
public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        super.onCreate(savedInstanceState);
        Intent intent = new Intent(this, TweetService.class);
        startService(intent);
    }
}

Я хотел иметь возможность информировать пользовательский интерфейс каждый раз, когда был твит, который содержал ссылку в нем, чтобы ссылка могла отображаться в пользовательском интерфейсе.

Я нашел сообщение в StackOverflow, в котором предлагалось, что один из способов сделать это — создать широковещательное сообщение, которое затем может прослушиваться BroadcastReceiver в действии.

Любые другие приложения также могут прослушивать широковещательные сообщения, если они хотят, но в этом случае информация не очень важна, поэтому я думаю, что этот подход вполне подходит.

Сначала мне пришлось изменить сервис, чтобы он выглядел так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class TweetTask {
    public static final String NEW_TWEET = "tweet_task.new_tweet";
}
  
public class TweetService extends IntentService {
    String consumerKey = "TwitterConsumerKey";
    String consumerSecret = "TwitterConsumerSecret";
  
    public TweetService() {
        super("Tweet Service");
    }
  
    @Override
    protected void onHandleIntent(Intent intent) {
        AccessToken accessToken = createAccessToken();
  
        StatusListener listener = new UserStreamListener() {
           // override a whole load of methods - removed for brevity
  
            public void onStatus(Status status) {
                String theTweet = status.getText();
                if (status.getText().contains("http://")) {
                    Intent tweetMessage = new Intent(TweetTask.NEW_TWEET);
                    tweetMessage.putExtra(android.content.Intent.EXTRA_TEXT, document);
                    sendBroadcast(tweetMessage);
                }
  
            }
        };
        ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
        configurationBuilder.setOAuthConsumerKey(consumerKey);
        configurationBuilder.setOAuthConsumerSecret(consumerSecret);
  
        TwitterStream twitterStream = new TwitterStreamFactory(configurationBuilder.build()).getInstance(accessToken);
        twitterStream.addListener(listener);
        twitterStream.user();
    }
}

Затем мне пришлось определить следующий код в MyActivity :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class MyActivity extends Activity {
    protected void onResume() {
        super.onResume();
        if (dataUpdateReceiver == null) dataUpdateReceiver = new DataUpdateReceiver(textExtractionService);
        IntentFilter intentFilter = new IntentFilter(TweetTask.NEW_TWEET);
        registerReceiver(dataUpdateReceiver, intentFilter);
    }
  
    protected void onPause() {
        super.onPause();
        if (dataUpdateReceiver != null) unregisterReceiver(dataUpdateReceiver);
    }
  
    private class DataUpdateReceiver extends BroadcastReceiver {
        private CachedTextExtractionService textExtractionService;
  
        public DataUpdateReceiver(CachedTextExtractionService textExtractionService) {
            this.textExtractionService = textExtractionService;
        }
  
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(TweetTask.NEW_TWEET)) {
                // do something with the tweet
            }
  
        }
    }
}

Теперь, когда есть твит со ссылкой в ​​нем, мой BroadcastReceiver получает уведомление, и я могу делать с ним все, что захочу.

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

Ссылка: Изучение Android: Получение сервиса для общения с деятельностью от нашего партнера JCG Марка Нидхэма в блоге Марка Нидхэма .

Статьи по Теме :