Sunday 15 May 2011

twitter - Android Service Instantiating Twice When App Closes.(Twitter4j) -



twitter - Android Service Instantiating Twice When App Closes.(Twitter4j) -

i having problem service registering 1 time again when close application through task manager on phone. here code.

notification_service

import java.io.ioexception; import java.io.inputstream; import java.net.httpurlconnection; import java.net.url; import twitter4j.directmessage; import twitter4j.mediaentity; import twitter4j.stallwarning; import twitter4j.status; import twitter4j.statusdeletionnotice; import twitter4j.twitterstream; import twitter4j.twitterstreamfactory; import twitter4j.user; import twitter4j.userlist; import twitter4j.userstreamlistener; import twitter4j.auth.accesstoken; import twitter4j.conf.configurationbuilder; import android.app.notificationmanager; import android.app.pendingintent; import android.app.service; import android.content.context; import android.content.intent; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.media.ringtonemanager; import android.net.uri; import android.os.ibinder; import android.support.v4.app.notificationcompat; import android.support.v4.content.localbroadcastmanager; import android.util.log; import com.parse.parsetwitterutils; public class notification_service extends service{ @override public ibinder onbind(intent intent) { // todo auto-generated method stub homecoming null; } @override public int onstartcommand(intent intent, int flags, int startid) { // todo auto-generated method stub twitterstream twitterstream = new twitterstreamfactory(new configurationbuilder().setjsonstoreenabled(true).build()).getinstance(); twitterstream.setoauthconsumer(parsetwitterutils.gettwitter().getconsumerkey(), parsetwitterutils.gettwitter().getconsumersecret()); accesstoken token = new accesstoken(parsetwitterutils.gettwitter().getauthtoken(), parsetwitterutils.gettwitter().getauthtokensecret()); twitterstream.setoauthaccesstoken(token); twitterstream.addlistener(listener); twitterstream.user(); homecoming super.onstartcommand(intent, flags, startid); } @override public void ondestroy() { // todo auto-generated method stub super.ondestroy(); } userstreamlistener listener = new userstreamlistener() { @override public void ondeletionnotice(statusdeletionnotice arg0) { // todo auto-generated method stub } @override public void onscrubgeo(long arg0, long arg1) { // todo auto-generated method stub } @override public void onstallwarning(stallwarning arg0) { // todo auto-generated method stub } @override public void onstatus(final status status) { // todo auto-generated method stub if(status.gettext().contains("@" + parsetwitterutils.gettwitter().getscreenname())){ notify(status.getuser().getscreenname(), status.getuser().getscreenname(), status.gettext()); } intent intent = new intent("com.receivetweet.grabtweets"); intent.putextra("tweet_id", status.getid()); /*if(status.isfavorited()){ intent.putextra("tweetisfavorited", true); }else{ intent.putextra("tweetisfavorited", false); } */ if(status.isretweet()){ intent.putextra("tweet", status.getretweetedstatus().gettext()); }else{ intent.putextra("tweet", status.gettext()); } intent.putextra("tweet_name", status.getuser().getname()); intent.putextra("tweet_screenname", status.getuser().getscreenname()); intent.putextra("tweet_profilepicture", status.getuser().getprofileimageurl()); mediaentity []mediaentities = status.getmediaentities(); if (mediaentities != null && status.getmediaentities().length>0) { log.d("mediaentities","getmediaentities not null"); //just testing if (mediaentities.length > 0) { log.d("mediaentities","getmediaentities not null"); intent.putextra("tweetpicture", mediaentities[0].getmediaurl().tostring()); } } localbroadcastmanager.getinstance(getapplicationcontext()).sendbroadcast(intent); } @override public void ontracklimitationnotice(int arg0) { // todo auto-generated method stub } @override public void onexception(exception arg0) { // todo auto-generated method stub } @override public void onblock(user arg0, user arg1) { // todo auto-generated method stub } @override public void ondeletionnotice(long arg0, long arg1) { // todo auto-generated method stub } @override public void ondirectmessage(directmessage arg0) { // todo auto-generated method stub } @override public void onfavorite(user arg0, user arg1, status arg2) { // todo auto-generated method stub } @override public void onfollow(user arg0, user arg1) { // todo auto-generated method stub } @override public void onfriendlist(long[] arg0) { // todo auto-generated method stub } @override public void onunblock(user arg0, user arg1) { // todo auto-generated method stub } @override public void onunfavorite(user arg0, user arg1, status arg2) { // todo auto-generated method stub } @override public void onunfollow(user arg0, user arg1) { // todo auto-generated method stub } @override public void onuserlistcreation(user arg0, userlist arg1) { // todo auto-generated method stub } @override public void onuserlistdeletion(user arg0, userlist arg1) { // todo auto-generated method stub } @override public void onuserlistmemberaddition(user arg0, user arg1, userlist arg2) { // todo auto-generated method stub } @override public void onuserlistmemberdeletion(user arg0, user arg1, userlist arg2) { // todo auto-generated method stub } @override public void onuserlistsubscription(user arg0, user arg1, userlist arg2) { // todo auto-generated method stub } @override public void onuserlistunsubscription(user arg0, user arg1, userlist arg2) { // todo auto-generated method stub } @override public void onuserlistupdate(user arg0, userlist arg1) { // todo auto-generated method stub } @override public void onuserprofileupdate(user arg0) { // todo auto-generated method stub } }; private void notify(string user,string notificationtitle, string notificationmessage) { uri defaultsound = ringtonemanager.getdefaulturi(ringtonemanager.type_notification); notificationcompat.builder builder = new notificationcompat.builder(this) .setsmallicon(r.drawable.ic_launcher) .setticker("you've been mention in tweet") .setsound(defaultsound) .setcontenttitle(notificationtitle) .setcontenttext(notificationmessage); intent notificationintent = new intent(this, mainactivity.class); pendingintent contentintent = pendingintent.getactivity(this, 0, notificationintent, pendingintent.flag_update_current); builder.setcontentintent(contentintent); // add together notification notificationmanager manager = (notificationmanager) getsystemservice(context.notification_service); manager.notify(908596, builder.build()); } public void cancelnotification(int notificationid){ if (context.notification_service!=null) { string ns = context.notification_service; notificationmanager nmgr = (notificationmanager) getapplicationcontext().getsystemservice(ns); nmgr.cancel(908596); } } public bitmap getbitmapfromurl(string strurl) { seek { url url = new url(strurl); httpurlconnection connection = (httpurlconnection) url.openconnection(); connection.setdoinput(true); connection.connect(); inputstream input = connection.getinputstream(); bitmap mybitmap = bitmapfactory.decodestream(input); homecoming mybitmap; } grab (ioexception e) { e.printstacktrace(); homecoming null; } } }

in oncreate of fragment class,i have inside.

getactivity().startservice(new intent(getactivity(), notification_service.class));

i set log within of service see if broadcast receiver or service,but maintain getting multiple logs service. how can prevent service instantiating multiple times?

the default homecoming value onstartcommand() start_sticky states:

if service's process killed while started (after returning onstartcommand(intent, int, int)), leave in started state don't retain delivered intent. later scheme seek re-create service.

therefore when close application, android scheme automatically restarting service. if you'd prefer not happen, can homecoming start_not_sticky (or in special cases start_redeliver_intent) instead of calling super.onstartcommand().

note onstartcommand() called every time phone call startservice() (or scheme restarts service you). if want run 1 time entire lifecycle of service, should set in oncreate() call.

android twitter service twitter4j

No comments:

Post a Comment