
Intent intent = VpnService.prepare(getActivity());if (intent != null) { startActivityForResult(intent,123);else { onActivityResult(123,Activity.RESulT_OK,null);} 在onActivityResult中,我开始了我的主题
@OverrIDepublic voID onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode,resultCode,data); if (requestCode == 123) { // Start some thread }} 现在我希望能够从我的应用程序的小部件中完成所有这些 *** 作.我似乎只能在Widget中使用startActivity,这是使用VPNService的正确方法.有什么方法可以从我的小部件实现这一点吗?也许从startActivity回调一下?
解决方法 没有太多的小部件经验,但建议采用这种方式:>仅为该startActivityForResult()调用创建虚拟活动(请注意我正在使用该活动的特定主题@androID:style / theme.Nodisplay);
>从小部件开始虚拟活动;
>使用SharedPreferences将结果存储到活动中并为小部件发送广播;
以下是示例项目:
AndroIDManifest.xml中:
<manifest xmlns:androID="http://schemas.androID.com/apk/res/androID" package="com.alexstarc.testapp" androID:versionCode="1" androID:version@R_301_6889@="1.0"> <uses-sdk androID:minSdkVersion="19" androID:targetSdkVersion="19"/> <application androID:label="@string/app_@R_301_6889@" androID:icon="@drawable/ic_launcher" androID:allowBackup="true"> <activity androID:@R_301_6889@=".MyActivity" androID:label="@string/app_@R_301_6889@" androID:theme="@androID:style/theme.Nodisplay"> <intent-filter> <action androID:@R_301_6889@="androID.intent.action.MAIN"/> <category androID:@R_301_6889@="androID.intent.category.LAUNCHER"/> </intent-filter> </activity> <receiver androID:@R_301_6889@="TestWidgetProvIDer" androID:exported="false"> <intent-filter> <action androID:@R_301_6889@="androID.appWidget.action.APPWidget_UPDATE" /> <!-- Custom actions --> <action androID:@R_301_6889@="com.alexstarc.testapp.ACTION_BTN" /> <action androID:@R_301_6889@="com.alexstarc.testapp.ACTION_VPN_RESulT" /> </intent-filter> <Meta-data androID:@R_301_6889@="androID.appWidget.provIDer" androID:resource="@xml/appWidget_info" /> </receiver> </application></manifest>
appWidget_info.xml:
<appWidget-provIDer xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:minWIDth="180dp" androID:minHeight="40dp" androID:updatePeriodMillis="0" androID:initialLayout="@layout/appWidget" androID:resizeMode="horizontal|vertical" androID:Widgetcategory="home_screen" androID:prevIEwImage="@drawable/Widget_prevIEw"/>
appWidget.xml:
<relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:padding="4dp" androID:background="@drawable/appWidget_bg"> <Imagebutton androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:ID="@+ID/launchVPN" androID:src="@androID:drawable/ic_media_play"/> <TextVIEw androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:ID="@+ID/resultText" androID:layout_toRightOf="@ID/launchVPN" androID:text="@string/test_text" androID:gravity="bottom"/></relativeLayout>
MyActivity.java:
public class MyActivity extends Activity { private static final int VPN_LAUNCH_CODE = 123; public static String SHARED_PREFS_@R_301_6889@ = "shared_prefs"; public static String RESulT_VPN = "vpn_launch_result"; public static String ACTION_VPN_RESulT = "com.alexstarc.testapp.ACTION_VPN_RESulT"; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = VpnService.prepare(MyActivity.this); if (intent != null) { startActivityForResult(intent,VPN_LAUNCH_CODE); } else { onActivityResult(VPN_LAUNCH_CODE,null); } } @OverrIDe protected voID onActivityResult(final int requestCode,final int resultCode,final Intent data) { super.onActivityResult(requestCode,data); if (requestCode == 123) { getSharedPreferences(SHARED_PREFS_@R_301_6889@,MODE_MulTI_PROCESS).edit().putString(RESulT_VPN,"VPN Result is " + resultCode).commit(); final Intent resultIntent = new Intent(ACTION_VPN_RESulT); sendbroadcast(resultIntent); finish(); } }} TestWidgetProvIDer.java:
public final class TestWidgetProvIDer extends appwidgetprovider { private static final String ACTION_START_BTN = "com.alexstarc.testapp.ACTION_BTN"; // Todo: Use Shared Prefs for this private static int sWidgetID = 0; private static boolean sVPNDone = false; @OverrIDe public voID onUpdate(final Context context,final AppWidgetManager appWidgetManager,final int[] appWidgetIDs) { for (int WidgetID : appWidgetIDs) { updateWidget(context,appWidgetManager,WidgetID); } sWidgetID = appWidgetIDs[0]; } /** * Updates single App Widget * * @param context {@link androID.content.Context} * @param appWidgetManager {@link androID.appWidget.AppWidgetManager} * @param WidgetID of current Widget */ private static voID updateWidget(final Context context,final int WidgetID) { final ArrayList<Integer> Widgets = new ArrayList<Integer>(); final Intent btnClickIntent = new Intent(context,TestWidgetProvIDer.class); btnClickIntent.setAction(ACTION_START_BTN); final PendingIntent pendingIntent = PendingIntent.getbroadcast(context,btnClickIntent,0); // Get the layout for the App Widget and attach an on-click Listener // to the button RemoteVIEws vIEws = new RemoteVIEws(context.getPackage@R_301_6889@(),R.layout.appWidget); vIEws.setonClickPendingIntent(R.ID.launchVPN,pendingIntent); // Update from shared preferences after activity was launched if (sVPNDone) { vIEws.setTextVIEwText(R.ID.resultText,context.getSharedPreferences(MyActivity.SHARED_PREFS_@R_301_6889@,Context.MODE_PRIVATE).getString(MyActivity.RESulT_VPN,"No result")); } appWidgetManager.updateAppWidget(WidgetID,vIEws); } @OverrIDe public voID onReceive(final Context context,final Intent intent) { final String action = intent.getAction(); if (ACTION_START_BTN.equals(action)) { // Start Listening service final Intent vpnActivityIntent = new Intent(context,MyActivity.class); vpnActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(vpnActivityIntent); } else if (MyActivity.ACTION_VPN_RESulT.equals(action)) { sVPNDone = true; updateWidget(context,AppWidgetManager.getInstance(context),sWidgetID); } else { super.onReceive(context,intent); } }} 总结 以上是内存溢出为你收集整理的从android小部件中启动VPNService全部内容,希望文章能够帮你解决从android小部件中启动VPNService所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)