1

だから私は私が取り組んでいるアプリケーションのサービスを持っています。このサービスは、20 秒ごとにサーバーに接続して、更新があるかどうかを確認し、ある場合は通知を提供します。ここでいくつかの問題が発生しています。

1) 私のサービスは 30 分ほどで終了する傾向があります。Androidがそれを殺しているようです。どうすればそれを常に生かしておくことができますか?

2) 私のコードでわかるように、私のウェイクロックは奇妙です。通知を確認するためにスリープ中にアクティブにしておく必要がありますが、20 秒待ってからウェイクロックを取得すると機能しません。そのため、今はタイマーの前にウェイクロックを解放してから再取得します。これはバッテリーなどに良くありません。誰かがこれを行うより良い方法を知っていますか?

import java.io.IOException;
import java.net.UnknownHostException;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;

public class UpdateService extends Service {
    private boolean isRunning = true;
    String username, pass, outpt;
    String ns = Context.NOTIFICATION_SERVICE;

    int Notify_ID = 0;

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

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        username = intent.getStringExtra("username");
        pass = intent.getStringExtra("pass");

        isRunning = true;
            Thread contact = new Thread(new Contact());
            contact.start();

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // Stop the Background thread
        isRunning = false;

    }

    private class Contact implements Runnable {

        public void run() {
            while (isRunning) {

            PowerManager mgr = (PowerManager) UpdateService.this
                    .getSystemService(Context.POWER_SERVICE);
            WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                    "MyWakeLock");
            wakeLock.acquire();
            try {
                Thread.currentThread().sleep(20000);
                ServerContact server = new ServerContact("stuff i send to the server");
                outpt = server.connect();
                if (!outpt.equals("false")) {
                    handler.sendEmptyMessage(0);
                }

            } catch (UnknownHostException e) {
                System.err.println("cannot connect to host.");
            } catch (IOException e) {
                System.err.println("Server Contact ERROR!! ");
            } catch (InterruptedException e) {
                System.err.println("thread sleep interrupt ");
            }
            wakeLock.release();
            }

        }

        public Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == 0) {
                    for (String item : outpt.split("\\s+")) {
                        Notify_ID++;
                        notifySys(item, Notify_ID);
                    }
                }
            }
        };
    }

    public void notifySys(String data, int id) {
        // id/name/location
        try {
            String[] content = data.split("/");
            int icon = R.drawable.wcicon;
            CharSequence tickerText = "Word Circle";
            long when = System.currentTimeMillis();

            Notification notification = new Notification(icon, tickerText, when);

            Context context = getApplicationContext();
            CharSequence contentTitle = content[2];
            CharSequence contentText = "It is your turn!";
            Intent go = new Intent(UpdateService.this, SomeClass.class);


            PendingIntent contentIntent = PendingIntent.getActivity(
                    UpdateService.this, 0, go, 0);

            notification.setLatestEventInfo(context, contentTitle, contentText,
                    contentIntent);
            NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
            notification.defaults = Notification.DEFAULT_ALL;
            notification.flags |= Notification.FLAG_AUTO_CANCEL;
            mNotificationManager.notify(Notify_ID, notification);

        } catch (Exception e) {
            // TODO: handle exception
        }
    }

}
4

1 に答える 1

1

あなたがしていることはポーリングとして知られていますが、C2DM を使用してプッシュ通知を行う必要があります。このビデオはGoogle IO 2010 で見ることができます。C2DM のサンプル コードはこちらから入手できます。

于 2012-05-04T14:37:05.797 に答える