仅第一次执行活动

时间:2016-01-09 16:48:28

标签: android python

我正在使用android-python27项目,以便通过我的apk执行python脚本,我想将自己已经完成的应用程序与它合并。
首先在android-python项目中有这个活动:

    package com.android.python27;

import com.android.python27.config.GlobalConstants;
import com.android.python27.support.Utils;
import com.googlecode.android_scripting.FileUtils;

import java.io.File;
import java.io.InputStream;

import android.util.Log;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Resources;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class ScriptActivity extends Activity {
    ProgressDialog myProgressDialog; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // mounted sdcard ?
        //if (!Environment.getExternalStorageState().equals("mounted")) {
        //  Log.e(GlobalConstants.LOG_TAG, "External storage is not mounted");
        //  
        //  Toast toast = Toast.makeText( getApplicationContext(), "External storage not mounted", Toast.LENGTH_LONG);
        //  toast.show();
        //  return;
        //}

        // install needed ?
        boolean installNeeded = isInstallNeeded();

        if(installNeeded) {
          setContentView(R.layout.install); 
          new InstallAsyncTask().execute();
        }
        else {
            runScriptService();
            finish();
        }

        //onStart();
  }

    private void sendmsg(String key, String value) {
          Message message = installerHandler.obtainMessage();
          Bundle bundle = new Bundle();
          bundle.putString(key, value);
          message.setData(bundle);
          installerHandler.sendMessage(message);
       }

       final Handler installerHandler = new Handler() {
       @Override
       public void handleMessage(Message message) {
                Bundle bundle = message.getData();

                if (bundle.containsKey("showProgressDialog")) {
                   myProgressDialog = ProgressDialog.show(ScriptActivity.this, "Installing", "Loading", true); 
                }
                else if (bundle.containsKey("setMessageProgressDialog")) {
                    if (myProgressDialog.isShowing()) {
                        myProgressDialog.setMessage(bundle.getString("setMessageProgressDialog"));
                    }
                }
                else if (bundle.containsKey("dismissProgressDialog")) {
                    if (myProgressDialog.isShowing()) {
                        myProgressDialog.dismiss();
                    }
                }
                else if (bundle.containsKey("installSucceed")) {
                  Toast toast = Toast.makeText( getApplicationContext(), "Install Succeed", Toast.LENGTH_LONG);
                  toast.show();
                }
                else if (bundle.containsKey("installFailed")) {
                      Toast toast = Toast.makeText( getApplicationContext(), "Install Failed. Please check logs.", Toast.LENGTH_LONG);
                      toast.show();
                }
           }
       };

      public class InstallAsyncTask extends AsyncTask<Void, Integer, Boolean> {
           @Override
           protected void onPreExecute() {
           }

           @Override
           protected Boolean doInBackground(Void... params) {       
            Log.i(GlobalConstants.LOG_TAG, "Installing...");

            // show progress dialog
            sendmsg("showProgressDialog", "");

            sendmsg("setMessageProgressDialog", "Please wait...");
            createOurExternalStorageRootDir();

            // Copy all resources
            copyResourcesToLocal();

            // TODO
            return true;
           }

           @Override
           protected void onProgressUpdate(Integer... values) {
           }

           @Override
           protected void onPostExecute(Boolean installStatus) {
            sendmsg("dismissProgressDialog", "");

            if(installStatus) {
                sendmsg("installSucceed", "");
            }
            else {
                sendmsg("installFailed", "");
            }

            runScriptService();
            finish();
           }

      }

  private void runScriptService() {
      if(GlobalConstants.IS_FOREGROUND_SERVICE) {
          startService(new Intent(this, ScriptService.class));
      }
      else {
          startService(new Intent(this, BackgroundScriptService.class)); 
      }
  }

    private void createOurExternalStorageRootDir() {
        Utils.createDirectoryOnExternalStorage( this.getPackageName() );
    }

    // quick and dirty: only test a file
    private boolean isInstallNeeded() {
        File testedFile = new File(this.getFilesDir().getAbsolutePath()+ "/" + GlobalConstants.PYTHON_MAIN_SCRIPT_NAME);
        if(!testedFile.exists()) {
            return true;
        }
        return false;
    }


     private void copyResourcesToLocal() {
            String name, sFileName;
            InputStream content;

            R.raw a = new R.raw();
            java.lang.reflect.Field[] t = R.raw.class.getFields();
            Resources resources = getResources();

            boolean succeed = true;

            for (int i = 0; i < t.length; i++) {
                try {
                    name = resources.getText(t[i].getInt(a)).toString();
                    sFileName = name.substring(name.lastIndexOf('/') + 1, name.length());
                    content = getResources().openRawResource(t[i].getInt(a));
                    content.reset();

                    // python project
                    if(sFileName.endsWith(GlobalConstants.PYTHON_PROJECT_ZIP_NAME)) {
                        succeed &= Utils.unzip(content, this.getFilesDir().getAbsolutePath()+ "/", true);
                    }
                    // python -> /data/data/com.android.python27/files/python
                    else if (sFileName.endsWith(GlobalConstants.PYTHON_ZIP_NAME)) {
                        succeed &= Utils.unzip(content, this.getFilesDir().getAbsolutePath()+ "/", true);
                        FileUtils.chmod(new File(this.getFilesDir().getAbsolutePath()+ "/python/bin/python" ), 0755);
                    }
                    // python extras -> /sdcard/com.android.python27/extras/python
                    else if (sFileName.endsWith(GlobalConstants.PYTHON_EXTRAS_ZIP_NAME)) {
                        Utils.createDirectoryOnExternalStorage( this.getPackageName() + "/" + "extras");
                        Utils.createDirectoryOnExternalStorage( this.getPackageName() + "/" + "extras" + "/" + "tmp");
                        succeed &= Utils.unzip(content, Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + this.getPackageName() + "/extras/", true);
                    }

                } catch (Exception e) {
                    Log.e(GlobalConstants.LOG_TAG, "Failed to copyResourcesToLocal", e);
                    succeed = false;
                }
            } // end for all files in res/raw

     }

  @Override
  protected void onStart() {
      super.onStart();

      String s = "System infos:";
      s += " OS Version: " + System.getProperty("os.version") + "(" + android.os.Build.VERSION.INCREMENTAL + ")";
      s += " | OS API Level: " + android.os.Build.VERSION.SDK;
      s += " | Device: " + android.os.Build.DEVICE;
      s += " | Model (and Product): " + android.os.Build.MODEL + " ("+ android.os.Build.PRODUCT + ")";

      Log.i(GlobalConstants.LOG_TAG, s);

      //finish();
  }

}

这是清单文件:

<?xml version="1.0" encoding="utf-8"?>

<manifest   package="com.android.python27"
            android:versionCode="1"
            android:versionName="1.0"
            android:installLocation="internalOnly"
            xmlns:android="http://schemas.android.com/apk/res/android">

  <uses-sdk     android:minSdkVersion="4"/>

    <uses-permission
        android:name="android.permission.ACCESS_WIFI_STATE"
        android:required="true" />
    <uses-permission
        android:name="android.permission.CHANGE_WIFI_STATE"
        android:required="true" />
    <uses-permission
        android:name="android.permission.INTERNET"
        android:required="true" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  <application  android:debuggable="true"
                android:icon="@drawable/icon"
                android:label="@string/app_name"
                android:name="com.android.python27.ScriptApplication">

    <activity   android:name=".ScriptActivity"
                android:configChanges="keyboardHidden|orientation"
                android:theme="@android:style/Theme.Translucent.NoTitleBar">

      <intent-filter>
        <action     android:name="android.intent.action.MAIN" />
        <category   android:name="android.intent.category.LAUNCHER" />
      </intent-filter>

       <intent-filter>
        <action     android:name="com.googlecode.android_scripting.action.ACTION_LAUNCH_FOR_RESULT" />
        <category   android:name="android.intent.category.DEFAULT" />
      </intent-filter>

    </activity>

    <service    android:name="ScriptService">
        <intent-filter>
            <action android:name="com.android.python27.ScriptService" />
        </intent-filter>
    </service>

    <service    android:name="BackgroundScriptService">
        <intent-filter>
            <action android:name="com.android.python27.BackgroundScriptService" />
        </intent-filter>
    </service>

    <service android:name=".RpcServerService" />

    <activity   android:configChanges="keyboardHidden|orientation"
                android:name="com.googlecode.android_scripting.activity.FutureActivity" 
                android:theme="@android:style/Theme.Translucent"/>

    <activity   android:theme="@android:style/Theme.Translucent.NoTitleBar" 
                android:configChanges="keyboardHidden|orientation" 
                android:name="com.android.python27.DialogActivity"/>

    <activity
            android:name=".RpcServerLauncher"
            android:taskAffinity=""
            android:theme="@android:style/Theme.Translucent.NoTitleBar">
            <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
    </activity>

</application>

  <supports-screens android:xlargeScreens="true" />

  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<!--   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> -->
<!--   <uses-permission android:name="android.permission.REBOOT"/> -->
<!--   <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> -->
<!--   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> -->
<!--   <uses-permission android:name="android.permission.READ_LOGS"/> -->

  <!-- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> -->
  <!-- <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/> -->
  <!-- <uses-permission android:name="android.permission.STATUS_BAR"/> -->
  <!-- <uses-permission android:name="android.permission.DELETE_PACKAGES"/> -->
  <!-- <uses-permission android:name="android.permission.INSTALL_PACKAGES"/> -->         


  <!-- <uses-permission android:name="android.permission.VIBRATE" />  -->
  <!-- <uses-permission
   android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"/> -->
  <!-- <uses-permission
   android:name="android.permission.ACCESS_COARSE_LOCATION"/> -->
  <!-- <uses-permission
   android:name="android.permission.ACCESS_FINE_LOCATION"/> -->
  <!-- <uses-permission
   android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/> -->
  <!-- <uses-permission
   android:name="android.permission.ACCESS_MOCK_LOCATION"/> -->
  <!-- <uses-permission
   android:name="android.permission.ACCESS_SURFACE_FLINGER"/> -->
  <!-- <uses-permission
   android:name="android.permission.ACCOUNT_MANAGER"/> -->
  <!-- <uses-permission
   android:name="android.permission.AUTHENTICATE_ACCOUNTS"/> -->
  <!-- <uses-permission
   android:name="android.permission.BACKUP"/> -->
  <!-- <uses-permission
   android:name="android.permission.BACKUP_DATA"/> -->
  <!-- <uses-permission
   android:name="android.permission.BATTERY_STATS"/> -->
  <!-- <uses-permission
   android:name="android.permission.BIND_APPWIDGET"/> -->
  <!-- <uses-permission
   android:name="android.permission.BIND_INPUT_METHOD"/> -->
  <!-- <uses-permission
   android:name="android.permission.BIND_WALLPAPER"/> -->
  <!-- <uses-permission
   android:name="android.permission.BLUETOOTH"/> -->
  <!-- <uses-permission
   android:name="android.permission.BLUETOOTH_ADMIN"/> -->
  <!-- <uses-permission
   android:name="android.permission.BRICK"/> -->
  <!-- <uses-permission
   android:name="android.permission.BROADCAST_PACKAGE_REMOVED"/> -->
  <!-- <uses-permission
   android:name="android.permission.BROADCAST_SMS"/> -->
  <!-- <uses-permission
   android:name="android.permission.BROADCAST_STICKY"/> -->
  <!-- <uses-permission
   android:name="android.permission.BROADCAST_WAP_PUSH"/> -->
  <!-- <uses-permission
   android:name="android.permission.CALL_PHONE"/> -->
  <!-- <uses-permission
   android:name="android.permission.CALL_PRIVILEGED"/> -->
  <!-- <uses-permission
   android:name="android.permission.CAMERA"/> -->
  <!-- <uses-permission
   android:name="android.permission.CHANGE_BACKGROUND_DATA_SETTING"/> -->
  <!-- <uses-permission
   android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/> -->
  <!-- <uses-permission
   android:name="android.permission.CHANGE_CONFIGURATION"/> -->
  <!-- <uses-permission
   android:name="android.permission.CHANGE_NETWORK_STATE"/> -->
  <!-- <uses-permission
   android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> -->
  <!-- <uses-permission
   android:name="android.permission.CHANGE_WIFI_STATE"/> -->
  <!-- <uses-permission
   android:name="android.permission.CLEAR_APP_CACHE"/> -->
  <!-- <uses-permission
   android:name="android.permission.CLEAR_APP_USER_DATA"/> -->
  <!-- <uses-permission
   android:name="android.permission.CONTROL_LOCATION_UPDATES"/> -->
  <!-- <uses-permission
   android:name="android.permission.DELETE_CACHE_FILES"/> -->
  <!-- <uses-permission
   android:name="android.permission.DEVICE_POWER"/> -->
  <!-- <uses-permission
   android:name="android.permission.DIAGNOSTIC"/> -->
  <!-- <uses-permission
   android:name="android.permission.DISABLE_KEYGUARD"/> -->
  <!-- <uses-permission
   android:name="android.permission.DUMP"/> -->
  <!-- <uses-permission
   android:name="android.permission.FACTORY_TEST"/> -->
  <!-- <uses-permission
   android:name="android.permission.FLASHLIGHT"/> -->
  <!-- <uses-permission
   android:name="android.permission.FORCE_BACK"/> -->
  <!-- <uses-permission
   android:name="android.permission.GET_ACCOUNTS"/> -->
  <!-- <uses-permission
   android:name="android.permission.GET_PACKAGE_SIZE"/> -->
  <!-- <uses-permission
   android:name="android.permission.GET_TASKS"/> -->
  <!-- <uses-permission
   android:name="android.permission.GLOBAL_SEARCH"/> -->
  <!-- <uses-permission
   android:name="android.permission.GLOBAL_SEARCH_CONTROL"/> -->
  <!-- <uses-permission
   android:name="android.permission.HARDWARE_TEST"/> -->
  <!-- <uses-permission
   android:name="android.permission.INJECT_EVENTS"/> -->
  <!-- <uses-permission
   android:name="android.permission.INSTALL_LOCATION_PROVIDER"/> -->
  <!-- <uses-permission
   android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/> -->
  <!-- <uses-permission
   android:name="android.permission.MANAGE_ACCOUNTS"/> -->
  <!-- <uses-permission
   android:name="android.permission.MANAGE_APP_TOKENS"/> -->
  <!-- <uses-permission
   android:name="android.permission.MASTER_CLEAR"/> -->
  <!-- <uses-permission
   android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> -->
  <!-- <uses-permission
   android:name="android.permission.MODIFY_PHONE_STATE"/> -->
  <!-- <uses-permission
   android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/> -->
  <!-- <uses-permission
   android:name="android.permission.PACKAGE_USAGE_STATS"/> -->
  <!-- <uses-permission
   android:name="android.permission.PERFORM_CDMA_PROVISIONING"/> -->
  <!-- <uses-permission
   android:name="android.permission.PERSISTENT_ACTIVITY"/> -->
  <!-- <uses-permission
   android:name="android.permission.PROCESS_OUTGOING_CALLS"/> -->
  <!-- <uses-permission
   android:name="android.permission.READ_CALENDAR"/> -->
  <!-- <uses-permission
   android:name="android.permission.READ_CONTACTS"/> -->
  <!-- <uses-permission
   android:name="android.permission.READ_FRAME_BUFFER"/> -->
  <!-- <uses-permission
   android:name="android.permission.READ_HISTORY_BOOKMARKS"/> -->
  <!-- <uses-permission
   android:name="android.permission.READ_INPUT_STATE"/> -->
  <!-- <uses-permission
   android:name="android.permission.READ_OWNER_DATA"/> -->
  <!-- <uses-permission
   android:name="android.permission.READ_PHONE_STATE"/> -->
  <!-- <uses-permission
   android:name="android.permission.READ_SMS"/> -->
  <!-- <uses-permission
   android:name="android.permission.READ_SYNC_SETTINGS"/> -->
  <!-- <uses-permission
   android:name="android.permission.READ_SYNC_STATS"/> -->
  <!-- <uses-permission
   android:name="android.permission.READ_USER_DICTIONARY"/> -->
  <!-- <uses-permission
   android:name="android.permission.REBOOT"/> -->
  <!-- <uses-permission
   android:name="android.permission.RECEIVE_MMS"/> -->
  <!-- <uses-permission
   android:name="android.permission.RECEIVE_SMS"/> -->
  <!-- <uses-permission
   android:name="android.permission.RECEIVE_WAP_PUSH"/> -->
  <!-- <uses-permission
   android:name="android.permission.RECORD_AUDIO"/> -->
  <!-- <uses-permission
   android:name="android.permission.REORDER_TASKS"/> -->
  <!-- <uses-permission
   android:name="android.permission.RESTART_PACKAGES"/> -->
  <!-- <uses-permission
   android:name="android.permission.SEND_SMS"/> -->
  <!-- <uses-permission
   android:name="android.permission.SET_ACTIVITY_WATCHER"/> -->
  <!-- <uses-permission
   android:name="android.permission.SET_ALWAYS_FINISH"/> -->
  <!-- <uses-permission
   android:name="android.permission.SET_ANIMATION_SCALE"/> -->
  <!-- <uses-permission
   android:name="android.permission.SET_DEBUG_APP"/> -->
  <!-- <uses-permission
   android:name="android.permission.SET_ORIENTATION"/> -->
  <!-- <uses-permission
   android:name="android.permission.SET_PREFERRED_APPLICATIONS"/> -->
  <!-- <uses-permission
   android:name="android.permission.SET_PROCESS_LIMIT"/> -->
  <!-- <uses-permission
   android:name="android.permission.SET_TIME_ZONE"/> -->
  <!-- <uses-permission
   android:name="android.permission.SET_WALLPAPER"/> -->
  <!-- <uses-permission
   android:name="android.permission.SET_WALLPAPER_COMPONENT"/> -->
  <!-- <uses-permission
   android:name="android.permission.SET_WALLPAPER_HINTS"/> -->
  <!-- <uses-permission
   android:name="android.permission.SHUTDOWN"/> -->
  <!-- <uses-permission
   android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES"/> -->
  <!-- <uses-permission
   android:name="android.permission.STOP_APP_SWITCHES"/> -->
  <!-- <uses-permission
   android:name="android.permission.SUBSCRIBED_FEEDS_READ"/> -->
  <!-- <uses-permission
   android:name="android.permission.SUBSCRIBED_FEEDS_WRITE"/> -->
  <!-- <uses-permission
   android:name="android.permission.SYSTEM_ALERT_WINDOW"/> -->
  <!-- <uses-permission
   android:name="android.permission.UPDATE_DEVICE_STATS"/> -->
  <!-- <uses-permission
   android:name="android.permission.USE_CREDENTIALS"/> -->
  <!-- <uses-permission
   android:name="android.permission.WAKE_LOCK"/> -->
  <!-- <uses-permission
   android:name="android.permission.WRITE_APN_SETTINGS"/> -->
  <!-- <uses-permission
   android:name="android.permission.WRITE_CALENDAR"/> -->
  <!-- <uses-permission
   android:name="android.permission.WRITE_CONTACTS"/> -->
  <!-- <uses-permission
   android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> -->
  <!-- <uses-permission
   android:name="android.permission.WRITE_GSERVICES"/> -->
  <!-- <uses-permission
   android:name="android.permission.WRITE_HISTORY_BOOKMARKS"/> -->
  <!-- <uses-permission
   android:name="android.permission.WRITE_OWNER_DATA"/> -->
  <!-- <uses-permission
   android:name="android.permission.WRITE_SECURE_SETTINGS"/> -->
  <!-- <uses-permission
   android:name="android.permission.WRITE_SETTINGS"/> -->
  <!-- <uses-permission
   android:name="android.permission.WRITE_SMS"/> -->
  <!-- <uses-permission
   android:name="android.permission.WRITE_SYNC_SETTINGS"/> -->
  <!-- <uses-permission
   android:name="android.permission.WRITE_USER_DICTIONARY"/> -->


<!-- <uses-permission android:name="android.permission.VIBRATE"></uses-permission> -->
</manifest>

当你第一次执行启动时,android-python27应用程序会出现一个活动,它会在我的设备中安装所需的文件夹。每当你尝试它再次打开它它什么都不做(它不会打开一个活动,只执行打印&#34;你好&#34;)的python脚本。 我想要的是更改清单文件,以便在我再次打开应用程序后打开我自己的活动。(在本地安装所需文件夹的活动应该只在第一次执行。)


任何建议都会有所帮助并深受赞赏。

1 个答案:

答案 0 :(得分:1)

manifests.xml中的主要活动无法更改,这意味着创建的第一个活动一旦确定就无法更改,但第一个活动的视图无法显示任何内容并执行您的自定义逻辑并转到另一个活性。

为了满足您的需求,您可以在检测到文件安装后启动活动。

if(installNeeded) {
      setContentView(R.layout.install); 
      new InstallAsyncTask().execute();
    }
    else {
        runScriptService();
        finish();
        startActivity(this,<nextactivity you want to goto>) //add this
    }