#mono
#моно
Вопрос:
Мой последний вопрос не был отличным вопросом. итак, вот мой новый.
Я хочу написать приложение, которое имеет и activity, которое получает некоторую информацию (например, номер телефона) от пользователя, а затем оно уничтожается, а значок приложения также скрыт от пользователя. но я хочу постоянно получать sms с этого номера телефона и делать кое-что. до сих пор я узнал, что если я зарегистрирую свой широковещательный приемник в манифесте, он все равно может получать, даже если мое приложение не запущено или скрыто. итак, вот мое приложение, которое я использую xamarin (mono android): мое простое действие (оно еще не завершено):
мой основной XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:p1="http://schemas.android.com/apk/res/android"
p1:orientation="vertical"
p1:minWidth="25px"
p1:minHeight="25px"
p1:layout_width="match_parent"
p1:layout_height="match_parent"
p1:id="@ id/linearLayout1">
<EditText
p1:layout_width="match_parent"
p1:layout_height="wrap_content"
p1:id="@ id/txt_phone" />
<Button
p1:text="OK"
p1:layout_width="match_parent"
p1:layout_height="wrap_content"
p1:id="@ id/btn_ok" />
</LinearLayout>
и класс activity:
namespace SmsBroadcastReceiver
{
[Activity (Label = "SmsBroadcastReceiver", MainLauncher = true)]
public class MainActivity : Activity
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView (Resource.Layout.Main);
EditText txt_number = FindViewById<EditText> (Resource.Id.txt_phone);
Button btn_ok = FindViewById<Button> (Resource.Id.btn_ok);
btn_ok.Click = delegate {
//save the number in the sharedpreference and then...
Toast.MakeText (Context, "Your App Will be Closed now", ToastLength.Short).Show ();
};
}
}
}
теперь мой широковещательный приемник:
namespace SmsBroadcastReceiver
{
[BroadcastReceiver]
public class SmsReceiver : BroadcastReceiver
{
public override void OnReceive (Context context, Intent intent)
{
Toast.MakeText (context, "sms rec", ToastLength.Long).Show ();
//get the sharedpreference and then do stuff
}
}
}
и мой манифест:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="SmsBroadcastReceiver.SmsBroadcastReceiver">
<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="18" />
<application android:label="SmsBroadcastReceiver">
</application>
<receiver android:name=".SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
</manifest>
Я знаю, что использование toast в BR не идеально, но я просто хочу видеть, что он работает, а это не так, каждый раз, когда я отправляю и отправляю sms на свой телефон, он ничего не показывает.
в чем моя проблема?
Ответ №1:
Я думаю, вы неправильно создали BroadcastReceiver. Вы должны создать его полностью с атрибутами xamarin. Mono для Android преобразует каждое IntentFilterAttribute
из них в <intent-filter/>
элемент.
[BroadcastReceiver]
[IntentFilter(new string[] { "android.provider.Telephony.SMS_RECEIVED" })]
public class SmsReceiver : BroadcastReceiver
{
...
}
поэтому нет необходимости вручную записывать теги получателя в ваш файл AndroidManifest.
Вы также можете использовать именованные параметры атрибута для приоритета, категорий и т. Д.
[IntentFilter(new string[] { "android.provider.Telephony.SMS_RECEIVED" }, Priority = Int32.MaxValue)]
Комментарии:
1. в конце концов, кто-то. большое вам спасибо, я не знал that.it но как я могу таким образом установить приоритет моего получателя?
2. Спасибо. итак, вы уверены, что при использовании этого способа мой широковещательный rec все еще реагирует и получает sms после того, как я закрыл приложение?
3. что делать, если мне нужно включить широковещательный приемник только тогда, когда ОС установлена на kitkat или новее?