Службы Android не работают во время выхода из приложения - PullRequest
0 голосов
/ 28 ноября 2011

У меня проблема с запуском сервиса, на самом деле сервис не работает, когда я выхожу из приложения или выхожу из самого приложения или нажимаю кнопку «Выход из приложения» в диспетчере задач. Если приложение не близко, сервисы работают, и пользователь будет уведомлен. Сервис фактически уведомит пользователя о последнем комментарии. ниже мой класс обслуживания.

package com.android.my.hotnews;

import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.Cursor;

public class CommentNotificationService extends Service{

    private Notification notifyMe;
    private NotificationManager notifyManager;
    private PendingIntent pIntent;
    private Intent intent;
    private static String DBPATH="data/data/com.android.my.hotnews/databases/";
    private static String DBNAME="mydb.db"; 
    private String path = DBPATH+DBNAME;
    private Timer timer = new Timer();
    private static final long UPDATE_INTERVAL = 5000;
    String title = null;
    String content = null;
    String date = null;
    Calendar cal = null;

    public void onCreate(){
        super.onCreate();
        notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notifyMe = new Notification(R.drawable.comment_icon, "New Comment", System.currentTimeMillis());

        intent = new Intent(android.content.Intent.ACTION_VIEW, null, getApplicationContext(), CommentViewer.class);
        pIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
        inComingComment();
    }

    public void inComingComment() throws SQLiteException{
        SQLiteDatabase db;
        db=SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
        Cursor rs = db.rawQuery("SELECT * FROM Comment_Log ORDER BY Comment_Date_Time ASC", null);

        if(rs.getCount()>0){
            rs.moveToFirst();
            try {
                String[] dmy = rs.getString(1).split("/");
                String[] hm = rs.getString(2).split(":");
                cal = Calendar.getInstance();
                cal.set(Calendar.DATE, Integer.parseInt(dmy[0]));
                cal.set(Calendar.MONTH, Integer.parseInt(dmy[1])-1);
                cal.set(Calendar.YEAR, Integer.parseInt(dmy[2]));
                cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hm[0]));
                cal.set(Calendar.MINUTE, Integer.parseInt(hm[1]));
                title="new comment";
                content=rs.getString(3);                
                db.close();
            } catch (Exception e) {             
                log.d("error ocurred",e.getClass().getName());
                db.close();
            }           
        }       
        //timer.scheduleAtFixedRate(new TimerTask(){
        timer.schedule(new TimerTask(){
            @Override
            public void run() {
                notifyMe.setLatestEventInfo(getApplicationContext(), title , content, pIntent);             
                notifyManager.notify(0, notifyMe);              
            }           
        }, cal.getTime(), UPDATE_INTERVAL);

    }

    public void onDestroy(){

    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}

ниже - мой файл манифеста

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.android.my.hotnews"
   android:versionCode="1"
   android:versionName="1.0">
<supports-screens
     android:largeScreens="true"
     android:normalScreens="true"
     android:smallScreens="true"
     android:resizeable="true"
     android:anyDensity="true"
 />
<application android:icon="@drawable/apps_icon" android:label="@string/app_name" android:debuggable="true">
   <activity android:name=".ContentLoader"
       android:configChanges="orientation|keyboardHidden">
     <intent-filter>
       <action android:name="android.intent.action.MAIN" />
       <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
   </activity> 
   <activity android:name=".CommentViewer" android:configChanges="orientation|keyboardHidden"/>  
   <service android:name=".CommentNotificationService"/>
</application>
</manifest>

Ответы [ 3 ]

0 голосов
/ 28 ноября 2011

служба не работает, когда я выхожу из моего приложения, выход из самого приложения или нажимаю кнопку «Выход из приложения» из диспетчера задач

В Android нет «выхода из самого приложения», поэтому неясно, что вы подразумеваете под этим.

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

Кроме того, крайне маловероятно, что «средство просмотра комментариев» нуждается в android:configChanges="orientation|keyboardHidden", так как немногие действия должны использовать это.

0 голосов
/ 29 ноября 2011

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

package com.android.my.hotnews;

import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.Cursor;

public class CommentNotificationService extends Service{

    private Notification notifyMe;
    private NotificationManager notifyManager;
    private PendingIntent pIntent;
    private Intent intent;
    private static String DBPATH="data/data/com.android.my.hotnews/databases/";
    private static String DBNAME="mydb.db"; 
    private String path = DBPATH+DBNAME;
    private Timer timer = new Timer();
    private static final long UPDATE_INTERVAL = 5000;
    String title = null;
    String content = null;
    String date = null;
    Calendar cal = null;

    public void onCreate(){
        super.onCreate();
        notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notifyMe = new Notification(R.drawable.comment_icon, "New Comment", System.currentTimeMillis());

        intent = new Intent(android.content.Intent.ACTION_VIEW, null, getApplicationContext(), CommentViewer.class);
        pIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
        inComingComment();
    }

    public void inComingComment() throws SQLiteException{
        SQLiteDatabase db;
        db=SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
        Cursor rs = db.rawQuery("SELECT * FROM Comment_Log ORDER BY Comment_Date_Time ASC", null);

        if(rs.getCount()>0){
            rs.moveToFirst();
            try {
                String[] dmy = rs.getString(1).split("/");
                String[] hm = rs.getString(2).split(":");
                cal = Calendar.getInstance();
                cal.set(Calendar.DATE, Integer.parseInt(dmy[0]));
                cal.set(Calendar.MONTH, Integer.parseInt(dmy[1])-1);
                cal.set(Calendar.YEAR, Integer.parseInt(dmy[2]));
                cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hm[0]));
                cal.set(Calendar.MINUTE, Integer.parseInt(hm[1]));
                title="new comment";
                content=rs.getString(3);                
                db.close();
            } catch (Exception e) {             
                log.d("error ocurred",e.getClass().getName());
                db.close();
            }           
        }       
        timer.schedule(new TimerTask(){
            @Override
            public void run() {
//here i set time for AlarmManager
                Intent intent = new android.content.Intent(getApplicationContext(), CommentReceiver.class);
                intent.putExtra("Title", title);
                intent.putExtra("Content", content);
                PendingIntent pIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
                am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pIntent);
            }           
        }, 0, UPDATE_INTERVAL);

    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}

ниже мой класс CommentReceiver

package com.android.my.hotnews;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.app.PendingIntent;
import android.app.Notification;
import android.app.NotificationManager;

public class CommentReceiver extends BroadcastReceiver{ 

    private NotificationManager nm;
    private Notification notify;

    @Override
    public void onReceive(Context context, Intent intent) {
        String title = intent.getExtras().get("Title").toString();
        String content = intent.getExtras().get("Content").toString();
        Intent notifyIntent = new Intent(context, CommentViewer.class);
        PendingIntent pending = PendingIntent.getActivity(context, 0, notifyIntent, 0);

        nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notify = new Notification(R.drawable.app_icon, "Incoming comment", System.currentTimeMillis());
        notify.setLatestEventInfo(context, title, content, pending);
        nm.notify(1, notify);
    }
}

Кстати, я новичок в разработке android, поэтому извините, если мой вопрос неясен. Я не думаю, что это лучший способ, так как сервис может зависать при нехватке памяти. Поэтому я должен напрямую использовать AlarmManager вместо вызова AlarmManager в сервисе, если нет взаимодействия между пользователем и приложениями.

0 голосов
/ 28 ноября 2011

Реализуйте onStartCommand в вашем сервисе и убедитесь, что вы вернули Service.START_STICKY; из него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...