从服务创建的通知将从状态栏中消失

时间:2014-01-23 06:57:42

标签: android file-upload android-service android-notifications

我有一个网络服务,我正在使用ksoap2连接到它并上传一些图片。

过程是:

  1. 打开图库
  2. 选择一些图片
  3. 分享到我的应用
  4. 启动前台服务
  5. 将基本信息发送到此服务,就像一个包含所有图片路径的数组
  6. 处理意图并采取捆绑
  7. 并使用正确的标志和startForeground(id,noty)
  8. 启动前台通知

    问题:   一切顺利。上传并显示上传的项目......直到...突然通知才会从栏中消失。

    过了一段时间它再次显示并继续上传,我试着设置一些东西来上传最后一项并从那里开始,我不知道我做得对,我想有一个关于此的建议。

    这是我致电服务的活动:

     Intent mServiceIntent = new Intent(this, UploadService.class);
    
            Bundle bund = new Bundle();
            bund.putStringArray("pathList", pictureList);
            bund.putString("tags", tag);
            boolean hasGeotag = UserManagerClass.UserLogged.isActiveLocation();
            bund.putBoolean("hasGeotag", hasGeotag);
            if (hasGeotag) {
                GeoTag gtag = UserManagerClass.UserLocation;
                bund.putDouble("latitude", gtag.getLatitude());
                bund.putDouble("longitude", gtag.getLongitude());
                bund.putString("city", gtag.getCity());
                bund.putString("country", gtag.getCountry());
                bund.putString("address", gtag.getAddress());
    
            }
            bund.putInt("idOwner", IDOWNER);
            bund.putInt("idUser", UserManagerClass.UserLogged.getID());
            bund.putInt("albumindex", albumIndex);
            bund.putInt("privacyindex", privacyIndex);
            bund.putString("comment", comment);
    
            mServiceIntent.putExtras(bund);
    
            startService(mServiceIntent);
    

    ,这是服务的代码:

    public class UploadService extends Service {
    
    private static final int myID = 1433;
    
    private static final String PREF_NAME = "SERVICEUPLOAD";
    
    private static final String UPLOADED_PATH = "UPLOADED_";
    
    private static int position;
    
    private int albumIndex;
    
    private String comment;
    
    private boolean hasGeotag;
    
    private int idOwner;
    
    private int idUser;
    
    private GeoTag location;
    
    private String[] pathList;
    
    private int privacyIndex;
    
    private SoapPost sp;
    
    private String tags;
    
    private NotificationManager nManager;
    
    private PendingIntent pi;
    
    
    @Override
    public void onCreate() {
    
        Log.e("step 1", "entered to create");
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        nManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
    }
    
    private void exit() {
    
        Log.e("step 10", "ending...");
        deletePosition();
        Log.e("step 12", "ended");
        this.stopForeground(true);
        updateNotification(true);
    }
    
    void createNotification() {
    
        Log.e("step 4", "entered to create notification");
        // In this sample, we'll use the same text for the ticker and the
        // expanded notification
        CharSequence text = getText(R.string.upload_waiting);
        //
        pi = PendingIntent.getActivity(this, 0, new Intent(), Notification.FLAG_FOREGROUND_SERVICE);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setSmallIcon(R.drawable.add_comment_icon);
        builder.setTicker(text);
        builder.setContentIntent(pi);
        builder.setContentText(text);
        builder.setContentTitle(text);
    
        startForeground(myID, builder.build());
    }
    
    private void updateNotification(boolean completed) {
    
        Log.e("step 8", "updating notification");
        String ticker = String.format(getResources().getString(R.string.upload_uploading_tick), position);
        String message = String.format(getResources().getString(R.string.upload_uploading_message_progress), position, pathList.length);
        String title = String.format(getResources().getString(R.string.upload_uploading_title), position);
        String title_completed = getResources().getString(R.string.upload_uploading_title_completed);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setSmallIcon(R.drawable.add_comment_icon);
    
        builder.setContentText(message);
        builder.setTicker(ticker);
    
        if (!completed)
            builder.setContentTitle(title);
        else {
            builder.setContentTitle(title_completed);
            pi = PendingIntent.getActivity(this, 0, new Intent(), 0);
    
        }
    
        builder.setContentIntent(pi);
        if (completed)
            nManager.notify(myID, builder.build());
        else
            startForeground(myID, builder.build());
    
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    
        Log.e("step 2", "entered to onstart");
        handleIntent(intent);
        return START_STICKY;
    }
    
    void handleIntent(Intent data) {
    
        Log.e("step 3", "entered to handle");
        // GETS THE POSITIONS IF THE SERVICE WAS STOPPED BEFORE
        // RETURN 0 IF IT WASNT
        getPosition();
        //
        if (data == null)
            this.stopForeground(true);
    
        Bundle dt = data.getExtras();
    
        tags = dt.getString("tags");
        pathList = dt.getStringArray("pathList");
        hasGeotag = dt.getBoolean("hasGeotag");
    
        if (hasGeotag) {
    
            location = new GeoTag();
            location.setLatitude(dt.getDouble("latitude"));
            location.setLongitude(dt.getDouble("longitude"));
            location.setAddress(dt.getString("address"));
            location.setCity(dt.getString("city"));
            location.setCountry(dt.getString("country"));
    
        }
        idOwner = dt.getInt("idOwner");
        idUser = dt.getInt("idUser");
        albumIndex = dt.getInt("albumindex");
        privacyIndex = dt.getInt("privacyindex");
        comment = dt.getString("comment");
        // isCover = dt.getBoolean("isCover");
        sp = new SoapPost();
    
        // CREATES THE NOTFICATION
        createNotification();
        // FINALLY SEND THE DATA TO THE WEB SERVICE
        sendData();
    }
    
    private void sendData() {
    
        Log.e("step 4", "entered to send data");
        for (String fl : pathList) {
            Log.e("step 5", "sending... " + fl);
            if (fl != null && !fl.equals(UPLOADED_PATH)) {
    
                try {
    
                    String[] dataup = new String[10];
    
                    if (hasGeotag) {
    
                        dataup = new String[15];
                        dataup[10] = String.valueOf(location.getLatitude());
                        dataup[11] = String.valueOf(location.getLongitude());
                        dataup[12] = location.getAddress();
                        dataup[13] = location.getCity();
                        dataup[14] = location.getCountry();
    
                    }
    
                    if (comment.length() > 0)
                        dataup[0] = URLEncoder.encode(comment, "UTF-8");
                    else
                        dataup[0] = "";
    
                    dataup[1] = String.valueOf(idOwner);
                    dataup[2] = String.valueOf(idUser);
                    dataup[3] = "2";
                    dataup[4] = "";
                    dataup[5] = String.valueOf(albumIndex);
                    dataup[6] = String.valueOf(privacyIndex);
                    dataup[7] = "";
                    dataup[8] = "";
                    dataup[9] = "";
    
                    File file = new File(fl);
                    // CONTINUE ONLY IF THE FILE EXISTS
                    if (file.exists()) {
                        Log.e("step 6", "file exists true");
                        // SETTING WIDTH AND HEIGHT
                        BitmapFactory.Options options = new BitmapFactory.Options();
                        options.inJustDecodeBounds = true;
                        BitmapFactory.decodeFile(fl, options);
                        int wth = options.outWidth;
                        int hth = options.outHeight;
                        long lenght = file.length();
                        // END W AND H
                        String b64 = null;
                        b64 = Base64.encodeToString(PictureManagerClass.getBytesFromFile(file), Base64.DEFAULT);
                        file = null;
                        // SETTING
                        // 4 BASE64
                        // 7 W
                        // 8 H
                        // 9 L
                        dataup[4] = b64;
                        dataup[7] = String.valueOf(wth);
                        dataup[8] = String.valueOf(hth);
                        dataup[9] = String.valueOf(lenght);
                        Log.e("step 7", "uploading... " + fl);
                        // SET THE CURRENT ITEM AS UPLOADED
                        pathList[position] = null;
                        // SAVE THE ACTUAL POSITION
                        savePosition();
                        sp.uploadPicture(dataup, tags, SoapPost.UPLOAD_PICTURE);
    
                        position++;
                        updateNotification(false);
    
                    }// END FILE EXISTS
    
                }
                catch (Exception ex) {
                    // SAVE THE ACTUAL POSITION
                    savePosition();
                    //
                    StackTraceElement[] stack = ex.getStackTrace();
                    String Trace = " ";
                    for (StackTraceElement line : stack) {
                        Trace += line.toString();
                    }
                    Log.e("SERVICE: ", Trace);
                }
    
            }// END FL NULL
    
        }// END FOR
        exit();
    }
    
    @Override
    public void onDestroy() {
    
        // SAVE THE ACTUAL POSITION
        savePosition();
        super.onDestroy();
    }
    
    @Override
    public void onLowMemory() {
    
        // SAVE THE ACTUAL POSITION
        savePosition();
        super.onLowMemory();
    }
    
    void savePosition() {
    
        Log.e("step 9", "saving position");
        // SET THE VALUES FROM PATHS TO SET TO SAVE IT INTO PREFERENCES
        SharedPreferences prefs = getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putInt("position", position);
        Set<String> set = new HashSet<String>();
        if (pathList != null) {
            for (int i = 0; i < position; i++)
                pathList[i] = null;
    
            for (int i = position; i < pathList.length; i++)
                if (pathList[i] != null)
                    set.add(pathList[i]);
        }
    
        if (pathList != null)
            editor.putStringSet("pathList", set);
        editor.commit();
    }
    
    void getPosition() {
    
        SharedPreferences prefs = getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        position = prefs.getInt("position", 0);
        Log.e("step 3.1", position + "");
        Set<String> set = new HashSet<String>();
        set = prefs.getStringSet("pathList", set);
    
        int pos = 0;
        for (String path : set) {
            pathList = new String[set.size()];
            pathList[pos] = path;
            pos++;
        }
    
    }
    
    void deletePosition() {
    
        Log.e("step 11", "clear...");
        SharedPreferences prefs = getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.clear();
        editor.commit();
    }
    
    /* (non-Javadoc)
     * @see android.app.Service#onBind(android.content.Intent)
     */
    @Override
    public IBinder onBind(Intent arg0) {
    
        // TODO Auto-generated method stub
        return null;
    }
    

    固定 我修好了......这是新方法sendData()

     private void sendData() {
    
        new Thread(new Runnable() {
    
            @Override
            public void run() {
    
                for (String fl : pathList) {
    
                    if (fl != null && !fl.equals(UPLOADED_PATH)) {
    
                        try {
    
                            String[] dataup = new String[10];
    
                            if (hasGeotag) {
    
                                dataup = new String[15];
                                dataup[10] = String.valueOf(location.getLatitude());
                                dataup[11] = String.valueOf(location.getLongitude());
                                dataup[12] = location.getAddress();
                                dataup[13] = location.getCity();
                                dataup[14] = location.getCountry();
    
                            }
    
                            if (comment.length() > 0)
                                dataup[0] = URLEncoder.encode(comment, "UTF-8");
                            else
                                dataup[0] = "";
    
                            dataup[1] = String.valueOf(idOwner);
                            dataup[2] = String.valueOf(idUser);
                            dataup[3] = "2";
                            dataup[4] = "";
                            dataup[5] = String.valueOf(albumIndex);
                            dataup[6] = String.valueOf(privacyIndex);
                            dataup[7] = "";
                            dataup[8] = "";
                            dataup[9] = "";
    
                            File file = new File(fl);
                            // CONTINUE ONLY IF THE FILE EXISTS
                            if (file.exists()) {
    
                                // SETTING WIDTH AND HEIGHT
                                BitmapFactory.Options options = new BitmapFactory.Options();
                                options.inJustDecodeBounds = true;
                                BitmapFactory.decodeFile(fl, options);
                                int wth = options.outWidth;
                                int hth = options.outHeight;
                                long lenght = file.length();
                                // END W AND H
    
                                byte[] pic = PictureManagerClass.getBytesFromFile(file);
                                Log.e("picLength", pic.length + "");
                                file = null;
                                // SETTING
                                // 4 BASE64
                                // 7 W
                                // 8 H
                                // 9 L
                                dataup[4] = "";
                                dataup[7] = String.valueOf(wth);
                                dataup[8] = String.valueOf(hth);
                                dataup[9] = String.valueOf(lenght);
                                Log.e("step 7", "uploading... " + fl);
                                // SET THE CURRENT ITEM AS UPLOADED
                                pathList[position] = null;
                                // SAVE THE ACTUAL POSITION
                                savePosition();
                                String mes = sp.uploadPicture(dataup, tags, SoapPost.UPLOAD_PICTURE, pic);
                                Log.e("picID", mes);
                                pic = null;
                                dataup = null;
                                position++;
                                updateNotification(false);
    
                                Thread.sleep(1 * 1000);
    
                            }// END FILE EXISTS
    
                        }
                        catch (Exception ex) {
                            // SAVE THE ACTUAL POSITION
                            savePosition();
                            //
                            StackTraceElement[] stack = ex.getStackTrace();
                            String Trace = " ";
                            for (StackTraceElement line : stack) {
                                Trace += line.toString();
                            }
                            Log.e("SERVICE: ", Trace);
                        }
    
                    }// END FL NULL
    
                }// END FOR
                exit();
    
            }
        }).start();;
    
    }
    

    现在通知不会隐藏,直到所有文件都上传...谢谢。

0 个答案:

没有答案