0

アクティビティが閉じていても、アプリケーションが機能し、着信インテントをリッスンするようにしたい。それを行うための最良の方法は何ですか?

マニフェストに受信者を登録しています:

    <receiver
        android:name="com.farawayapp.background.Receiver"
        android:exported="false" >
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            <action android:name="android.intent.action.PACKAGE_ADDED" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.intent.action.PACKAGE_CHANGED" />
            <action android:name="android.intent.action.PACKAGE_REMOVED" />

            <data android:scheme="package" />
        </intent-filter>
    </receiver>

そして、BroadcastReceiverクラスは次のとおりです。

public class Receiver extends BroadcastReceiver implements Variables {

    CheckConexion cc;

    @Override
    public void onReceive(Context contxt, Intent intent) {

        // Cuando hay un evento, lo diferenciamos y hacemos una acción.

        if (intent.getAction().equals(SMS_RECEIVED)) {
            Sms sms = new Sms(null, contxt);
            sms.uploadNewSms(intent);
        } else if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
            /*
             * try { new PhoneState(contxt).battery(intent.getIntExtra("level",
             * 0)); } catch (JSONException e) { e.printStackTrace(); }
             */// Nothing at the moment
        } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)
                || intent.getAction().equals(Intent.ACTION_PACKAGE_CHANGED)
                || intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) {
            Database db = new Database(contxt);
            if (db.open().Preferences(4)) {
                Uri data = intent.getData();
                new ListApps(contxt).import_app(intent, contxt, data,
                        intent.getAction());
            }
            db.close();
        } else if (intent.getAction().equals(
                ConnectivityManager.CONNECTIVITY_ACTION)) {
            cc = new CheckConexion(contxt);

            if (cc.isOnline()) {

                Database db = new Database(contxt);
                db.open();
                if (db.move() == 1) {
                    new UploadOffline(contxt);
                }
                db.close();

            }
        }
    }
}

ありがとう...

4

1 に答える 1

0

ブロードキャストを受信するように登録するBroadcastReceiverと、その時点でユーザーがアプリケーションを操作していなくても呼び出されます(アプリケーションのアクティビティはいずれもフォアグラウンドにありません)。ただし、おそらく考えたい落とし穴がいくつかあります。

  1. デバイスがスリープしているときは、ほとんどのインテントはブロードキャストされません。デバイスをウェイクアップするイベントはいくつかあります(着信SMS、着信コール、Googleクラウドメッセージングサーバーからのプッシュ通知など)。したがって、デバイスがスリープしているときにアプリケーションに何らかの作業を実行させたい場合は、アプリケーションをAlarmManager定期的に呼び出すアラームを設定することを検討する必要があります。

  2. バックグラウンドで作業を行いたい場合はWakeLock、デバイスがスリープしないようにする(およびCPUがオフになるのを防ぐ)ために使用することをお勧めします。これはCommonWareの優れたサンプルであり、使用方法を示しWakeLock、生活を楽にするための優れたライブラリを提供します:https ://github.com/commonsguy/cwac-wakeful 。WakeLockただし、バッテリーを消耗する可能性があるため、注意が必要です。

于 2012-09-23T00:59:45.650 に答える