Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当应用程序关闭时,Android服务实例化两次。(Twitter4j)_Android_Twitter_Service_Twitter4j - Fatal编程技术网

当应用程序关闭时,Android服务实例化两次。(Twitter4j)

当应用程序关闭时,Android服务实例化两次。(Twitter4j),android,twitter,service,twitter4j,Android,Twitter,Service,Twitter4j,当我通过手机上的任务管理器关闭应用程序时,我的服务再次注册时出现问题。这是我的密码 通知服务 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 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
    return 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();
    return 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 for 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 A 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 as 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) {
    try {
        URL url = new URL(strURL);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}
}
在我的片段类的onCreate中,我在里面有这个

getActivity().startService(new Intent(getActivity(), Notification_Service.class));

我在服务中放了一个日志,看看它是我的广播接收器还是服务,但我一直从服务中获取多个日志。如何防止我的服务多次实例化?

onStartCommand()的默认返回值为以下状态:

如果此服务的进程在启动时(从onStartCommand(Intent,int,int)返回后)被终止,则将其保持在已启动状态,但不保留此已交付的意图稍后,系统将尝试重新创建服务。

因此,当您关闭应用程序时,Android系统会自动重新启动您的服务。如果不希望发生这种情况,可以返回(或在特殊情况下),而不是调用
super.onStartCommand()


请注意,每次调用
startService()
(或系统为您重新启动服务)时,都会调用
onStartCommand()
。如果您希望在服务的整个生命周期中只运行一次,那么应该将其放入
onCreate()
调用中。

不幸的是,我仍然有这个问题。我两个都试过了,它还在运行。也许您的
onStartCommand()
代码应该在
onCreate()
onCreate()
在服务的整个生命周期中只调用一次,而不是每次调用
startService()
时运行的
onStartCommand()
?此外,我没有看到您注销侦听器。我希望即使应用程序关闭,服务也能在后台持续运行。