从android小部件中启动VPNService

从android小部件中启动VPNService,第1张

概述我在我的活动中启动了一个VPNService,我想在服务启动后启动一些线程.这就是我启动服务的方式: Intent intent = VpnService.prepare(getActivity());if (intent != null) { startActivityForResult(intent, 123);else { onActivityResult(123, Ac 我在我的活动中启动了一个VPNService,我想在服务启动后启动一些线程.这就是我启动服务的方式:

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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1125225.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存